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

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)

某些字符被 ':' 替换,这种情况仅发生在第一列内容中。我哪里出错了?

Ini*_*ian 5

该问题很可能是由于以下几个问题造成的:-

  • 您正在读取的文件没有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)