如何解决IFS无法很好地解析CSV
我正在尝试解析文件,以便获得第一列。我正在使用的命令是:
while IFS=',' read -r a; do echo "$a"; done < test.csv
但是,它仍然输出整个csv而不是第一列。 CSV的示例如下:
NOM,CODI,DATA,SEXE,GRUP_EDAT,RESIDENCIA,CASOS_CONFIRMAT,PCR,INGRESSOS_TOTAL,INGRESSOS_CRITIC,INGRESSATS_TOTAL,INGRESSATS_CRITIC,EXITUS
MOIANÃS,42,24/08/2020,Home,Majors de 74,No,2,0
ALT CAMP,01,30/07/2020,Dona,Entre 15 i 64,Si,Entre 65 i 74,1,0
我一直在寻找其他地方,所有人似乎都同意这是使用IFS解析csv时的正确方法。我注意到的一件事是,如果我向read函数添加新列,例如b,它将输出第一列而不是所有内容。
while IFS=',' read -r a b; do echo "$a"; done < test.csv
我不了解这种行为,并且它似乎比打印第一列还要有用。例如,如果我要放置c和$ c,它将不会显示第三列,依此类推。
您能解释一下这种现象以及为什么发生吗?
谢谢
解决方法
read
工作正常。它在IFS上拆分,并将每个字段分配给一个变量,其余部分转到最后一个变量。如果只给出一个变量,则整行都用到它。
bash
不是解析csv文件的正确工具,为此您应该考虑awk
。例如要打印前两列,请使用以下超级简单的awk命令:
awk -F,'{print $1,$2}' file.csv
只是要突出您的问题:关于您的bash
循环,最好使用数组将所有逗号分隔的列准备好放入数组:
while IFS=,read -ra arr; do
# print first 2 columns
echo "col1=${arr[0]},col2=${arr[1]}"
done < file.csv
,
对于简单 CSV文件,您可以简单地在每个逗号上进行拆分,但是除非您知道每个字段中的列数,否则您希望将输入读取为 array 行。
例如,如果您知道最多(最多)10列,则可以使用
while IFS=,read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10; do
但是,在bash
中,将整个拆分行读取为单个 array 更为简单:
while IFS=,read -ra f; do
第一个字段为"${f[0]}"
,第二个字段为"${f[1]}"
,依此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。