S_A*_*nth 2 csv bash shell scripting
我正在尝试使用 shell 脚本读取 csv 文件,使用以下命令。
cat file.csv | while read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,文件中的第一列未正确读取。
例如:如果第一列内容是
number1,
number2,
number3,
number4,
(so on)
Run Code Online (Sandbox Code Playgroud)
它输出:
::::er1,
::::er2,
::::er3,
::::er4,
Run Code Online (Sandbox Code Playgroud)
某些字符被 ':' 替换,这种情况仅发生在第一列内容中。我哪里出错了?
该问题很可能是由于以下几个问题造成的:-
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
Run Code Online (Sandbox Code Playgroud)
您可以看到它的工作原理如下。我的内容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
Run Code Online (Sandbox Code Playgroud)
不推荐使用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
Run Code Online (Sandbox Code Playgroud)