逐行读取文件计算各位和并判断奇偶的Shell脚本实现问题
Shell脚本实现方案
完整可运行代码
方案1:纯Bash实现
# 1. 生成带前导零的3位数字文件file01.txt seq -w 1 999 > file01.txt # 2. 逐行计算生成file02.txt # 先清空目标文件避免历史内容干扰 > file02.txt while IFS= read -r num; do # 分别取三位数字求和 digit1=${num:0:1} digit2=${num:1:1} digit3=${num:2:1} sum=$((digit1 + digit2 + digit3)) # 判断奇偶性 [ $((sum % 2)) -eq 1 ] && type="odd" || type="even" # 写入结果 echo "$num $type" >> file02.txt done < file01.txt
方案2:awk简洁实现(性能更高)
如果不需要保留中间过程,可直接用awk一行完成所有逻辑:
seq -w 1 999 | awk '{sum = substr($0,1,1) + substr($0,2,1) + substr($0,3,1); print $0, sum%2 ? "odd" : "even"}' > file02.txt # 需要单独保留file01.txt的话拆分执行即可: # seq -w 1 999 > file01.txt # awk '{sum = substr($0,1,1) + substr($0,2,1) + substr($0,3,1); print $0, sum%2 ? "odd" : "even"}' file01.txt > file02.txt
原脚本错误原因
你的写法存在三处核心问题:
- 语法错误:
IFS=read缺少空格,正确写法是IFS= read,否则系统会识别为非法命令 - 逻辑错误:
sum+=line是将整行字符串作为文本拼接进sum变量,没有拆分单数字计算,且没有逐行重置sum变量,最终得到的是整个文件所有行的拼接结果,不是逐行求和 - 缺少奇偶判断逻辑:没有对求和结果做奇偶性判定,直接输出sum不符合输出要求
内容的提问来源于stack exchange,提问作者GreenNinja69
相关产品推荐
相关产品推荐

