如何在Bash中逐行处理文本,实现分数计算与字符串截取
Bash文本处理问题解决方法
问题出在哪
你当前的命令会把文件里所有行的第一列全堆进$number,第二列全堆进$word,变量里是一堆值拼接成的字符串,自然没法单独处理每一行的分数和单词截取。
正确处理方式:逐行循环读取
用while read循环逐行读取文件,对每一行的分数和单词单独处理:
完整脚本(包含分数计算+字符串截取)
while read -r num word; do # 把分数转成小数(用bc工具做浮点计算) decimal=$(echo "scale=2; $num" | bc) echo "分数 $num 转小数:$decimal" # 拆分分数的分子和分母 numerator=$(echo "$num" | cut -d '/' -f1) denominator=$(echo "$num" | cut -d '/' -f2) # 计算要截取的字符串长度:(分子 × 单词长度) ÷ 分母 str_len=${#word} cut_len=$(( numerator * str_len / denominator )) # 截取字符串并输出 echo "${word:0:$cut_len}" done < "$1"
简化版(仅输出截取后的字符串)
如果不需要分数计算,只想要目标输出,用这个:
while read -r num word; do numerator=$(echo "$num" | cut -d '/' -f1) denominator=$(echo "$num" | cut -d '/' -f2) str_len=${#word} cut_len=$(( numerator * str_len / denominator )) echo "${word:0:$cut_len}" done < "$1"
测试效果
输入文件内容:
3/4 swimming 2/5 running
执行简化版脚本后,直接输出:
swimmi run
关键知识点
while read -r num word:自动按空格分割每行内容,把分数存入num、单词存入word,实现逐行处理${word:0:$cut_len}:Bash原生字符串截取语法,从开头截取指定长度的字符$(( ... )):Bash的整数运算语法,用来计算截取长度
内容的提问来源于stack exchange,提问作者GJO
相关产品推荐
相关产品推荐

