Bash中如何使用循环逐行读取文件并结合变量逐行处理输出
Shell逐行处理文本脚本问题修复
问题背景
- 待处理源文件内容:
01_AA_00 11 02_BB_00 11 03_CC_01 22 04_BB_01 22 05_CC_02 33 06_CC_02 33
- 预期输出:每行末尾追加固定字符串
AABBCCDD后写入新文件nFile.txt,效果如下:
01_AA_00 11 AABBCCDD 02_AA_00 11 AABBCCDD 03_AA_01 22 AABBCCDD 04_BB_01 22 AABBCCDD 05_CC_02 33 AABBCCDD 06_CC_02 33 AABBCCDD
- 约束:因为处理逻辑需要调用其他自定义变量,不能直接用awk单行命令,必须使用while循环逐行处理。
- 最初编写的错误脚本:
while IFS= read -r line; do fName=$(awk '{print $1}' $1) printf "$fName AABBCCDD\n" > nFile.txt done < $1
- 错误脚本运行结果:仅最后一行追加了目标字符串,其余行内容不符合预期:
01_AA_00 11 02_BB_00 11 03_CC_01 22 04_BB_01 22 05_CC_02 33 06_CC_02 33 AABBCCDD
原脚本的核心错误
- 写入模式错误:
>是覆盖写入符号,每轮循环执行写入时都会先清空nFile.txt的所有历史内容,前序循环写入的内容会被全部覆盖,最终文件只会保留最后一轮循环的写入结果。 - 文本读取逻辑错误:循环内的
awk '{print $1}' $1没有使用逐行读取到的$line变量,而是每轮循环都重新从头读取整个输入文件$1,输出整个文件所有行的第一列,完全违背了逐行处理的逻辑。 - 字段提取逻辑错误:原脚本只尝试提取每行的第一个字段,丢失了每行第二个数字字段,即使前两个错误修复,输出也会缺少原有第二列内容。
正确实现方式
先清空目标文件避免历史残留,循环内直接使用读取到的整行内容,用追加写入符号>>写入文件,循环体内可自由插入其他自定义变量的处理逻辑:
#!/bin/bash # 预先清空目标文件 > nFile.txt while IFS= read -r line; do # 此处可添加任意自定义逻辑,调用其他变量生成需要追加的内容 appendStr="AABBCCDD" printf "%s %s\n" "$line" "$appendStr" >> nFile.txt done < "$1"
如果需要拆分每行的单独字段做处理,直接用read命令内置的字段分割即可,不需要循环内调用awk,执行效率更高:
#!/bin/bash > nFile.txt # 直接按空格分割读入两个字段 while IFS=' ' read -r col1 col2; do # 可单独对col1、col2做加工,也可调用其他外部变量 appendStr="AABBCCDD" printf "%s %s %s\n" "$col1" "$col2" "$appendStr" >> nFile.txt done < "$1"
内容的提问来源于stack exchange,提问作者user18091468
相关产品推荐
相关产品推荐

