使用shell脚本输出::::而不是实际字符来解析和存储csv文件的值

时间:2016-06-30 23:51:22

标签: bash shell csv scripting

我正在尝试使用shell脚本读取csv文件,使用以下命令。

cat file.csv | while read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done

当我运行此命令时,文件中的第一列未正确读取。

对于Ex:如果第一列内容

number1,
number2,
number3,
number4,
(so on)

输出:

::::er1,
::::er2,
::::er3,
::::er4,

某些字符被':'取代 这仅适用于第一列内容。我哪里错了?

1 个答案:

答案 0 :(得分:3)

问题是由于很可能是几个问题: -

  • 您正在阅读没有IFS=,
  • 的文件
  • 您的csv文件可能有回车符(\r),这可能会导致read命令处理输入流的方式。

要删除回车符(\r),请使用tr -d '\r' < oldFile.csv > newFile.csv并在新文件中执行如下所述的解析。

如果不设置内部字段分隔符(IFS=","),则从输入流read读取时不知道在哪里分隔单词。在命令中添加相同内容。

cat file.csv | while IFS="," read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done

您可以看到它的工作原理如下。我有file.csv的内容如下。

$ cat file.csv
abc,def,ghi,ijk,lmn,opz
1,2,3,4,5,6

$ cat file.csv | while IFS="," read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done
abc:def:ghi:ijk:lmn:opz
1:2:3:4:5:6

不建议使用cat并将其循环播放,而bash爱好者通常将其称为UUOC - Useless Use Of Cat

你可以通过

来避免这种情况
#!/bin/bash

while IFS="," read -r a b c d e f;
do
    echo "$a:$b:$c:$d:$e:$f"
done < file.csv