如何在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
相关产品推荐
相关产品推荐

