Bash脚本实现每行最后两个元素拼接追加至行尾失败的问题求助
问题分析与解决方案
你的脚本有几个关键问题导致无法正常工作:
- 变量未传递给awk:循环里调用awk时,没有把当前读取的
line传给awk,所以awk根本没处理目标行的内容,ADD变量也得不到你想要的拼接结果。 - sed单引号不解析变量:sed命令用了单引号
's/$/,$ADD/',单引号会把内部内容当作纯字符串,不会解析$ADD变量,所以直接输出了$ADD文本。 - 循环中修改原文件的风险:在
while read循环里用sed -i修改原文件,会导致文件内容在循环过程中被改变,容易出现重复追加或读取混乱的问题。
最简单高效的解决方法:用awk一次性处理
其实不需要bash循环+awk+sed的复杂组合,awk本身就能完成所有操作,而且性能更好。直接运行下面的命令:
awk -F, '{print $0", "$4$5}' weather_sats.txt > temp.txt && mv temp.txt weather_sats.txt
命令解释:
-F,:指定逗号作为字段分隔符;{print $0", "$4$5}:$0代表当前整行的原始内容;", "$4$5表示追加「逗号+空格」,再拼接第4和第5个字段(也就是你需要的+3这类组合);
- 先把结果输出到临时文件
temp.txt,再替换原文件,避免直接修改原文件时的读写冲突。
如果你想保留bash循环的思路(不推荐,效率较低)
如果一定要用bash循环实现,需要调整成下面的写法:
#!/bin/bash file=weather_sats.txt temp_file=$(mktemp) # 创建临时文件存储处理后的结果 while IFS= read -r line do # 将当前行传给awk,提取并拼接第4、5字段 add=$(echo "$line" | awk -F, '{print $4$5}') # 把原行和拼接内容写入临时文件 echo "$line, $add" >> "$temp_file" done < "$file" # 用临时文件替换原文件 mv "$temp_file" "$file" exit 0
关键修改点:
- 用
echo "$line" | awk ...把当前行传递给awk,确保能正确提取目标字段; - 使用临时文件存储结果,避免循环中直接修改原文件导致的读写冲突;
- 用
IFS= read -r line来兼容包含特殊字符或空格的行(属于bash读取行的最佳实践)。
测试后,你的文件会生成如下结果:
GOES-15,167,170,+,3, +3
GOES-14,150,146,-,4, -4
GOES-13,100,100,-,0, -0
GOES-WEST,-160,-170,-,10, -10
完全符合你的需求。
内容的提问来源于stack exchange,提问作者NoRainDropsInTheSky
相关产品推荐
相关产品推荐

