You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:00:52