2010-11-26 81 views
63

我正在处理一个长的Bash脚本。我想将CSV文件中的单元格读入Bash变量。我可以解析行和第一列,但不能解析其他列。这是我的代码到目前为止:如何在Bash中解析CSV文件?


    cat myfile.csv|while read line 
    do 
    read -d, col1 col2 < <(echo $line) 
    echo "I got:$col1|$col2" 
    done 

它只打印第一列。作为一个额外的测试,我试过如下:

read -d, x y < <(echo a,b,)

而且$ y是空的。所以,我想:

read x y < <(echo a b)

而且$ y为b。为什么?

+6

你认为`awk`使用`$ 1`,`$ 2`等? – BeemerGuy 2010-11-26 15:23:59

+3

作为旁注:命令<<(回声“串”)--->命令<<<“字符串” – tokland 2010-11-26 16:56:45

回答

125

您需要使用IFS,而不是-d

while IFS=, read -r col1 col2 
do 
    echo "I got:$col1|$col2" 
done < myfile.csv 

注意,对于通用CSV解析,你应该使用专门的工具,它可以处理内部逗号引述领域,其他问题是猛砸不能自己处理。这种工具的例子是cvstoolcsvkit

6

man页:

-d DELIM DELIM的第一个字符被用于终止输入线, 而非换行符。

您正在使用-d,,它将终止逗号上的输入行。它不会阅读该行的其余部分。这就是为什么$ y是空的。