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

如何在Bash中遍历每行的逗号分隔元组并拆分变量

解决Bash中按行遍历CSV并拆分字段的问题

我有一个内容如下的文件files.txt:

14757,file_one
14756,file_two
14755,file_three

需要遍历文件每一行,把每行的两个字段分别赋值给变量,最终得到如下输出:

14757 and file_one
14756 and file_two
14755 and file_three

错误尝试及问题

之前使用的代码无法达到预期效果:

for i in $(cat files.txt); do IFS=","; set -- $i; echo $1 and $2; done

该代码会把每行的字段拆分成单独的循环项,输出结果如下:

14757 and
file_one
14756 and
file_two
14755 and
file_three and

原因是$(cat files.txt)会把文件内容按空格和换行符拆分,导致每个字段都成为for循环的单独迭代项,而非整行。


正确解决方案

方法一:使用while read(推荐)

这是Bash中逐行读取文件的标准可靠方式,同时指定逗号作为分隔符:

while IFS=, read -r id filename; do
    echo "$id and $filename"
done < files.txt
  • IFS=,:仅在本次read命令中,将逗号设为字段分隔符,不会全局修改
  • -r:禁用read的反斜杠转义功能,确保读取内容与文件完全一致
  • < files.txt:将文件作为循环的输入源,避免子进程问题

方法二:修复for循环写法

如果坚持使用for循环,需先让循环以整行为单位遍历:

# 临时修改IFS为换行符,让for循环按行迭代
IFS=$'\n'
for line in $(cat files.txt); do
    # 临时将IFS设为逗号,拆分当前行到位置参数
    IFS=, set -- "$line"
    echo "$1 and $2"
done
# 恢复默认IFS
unset IFS

内容的提问来源于stack exchange,提问作者Karolis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:41