如何使用bash上的csv文件中的特定列解析内容

时间:2013-06-11 13:24:04

标签: bash csv multiple-columns

我正在尝试逐行解析csv文件,其格式如下:

"name","content1,with commas as you see", "content2, also may contain commas", "..."
...
...

我想获取特定列的内容,不带引号。例如:第1列和第3列。所以预期的内容应该是:

name  (if get column 1)
content2, also may contain commas   (if get column 3)

我尝试使用awk但它没有用。我也试过了:

while IFS=, read col1 col2 col3 col4; 
do 
echo "got ${col1}|${col3}"; 
done < file

但是它包含引号“”,并且col3的内容是错误的,它混合了每列中的逗号。我应该如何拆分每列中包含逗号的格式呢?

2 个答案:

答案 0 :(得分:3)

如果您有GNU awk,那么FPAT会来救你。

gawk '{print $1,$3}' FPAT="([^,]+)|(\"[^\"]+\")" my.csv

awk中,我们通常使用FS来定义字段不是什么,而不是字段是什么。在这种特殊情况下,我们真的希望按照它们的定义来定义字段,而FPAT允许我们完成这些操作。

答案 1 :(得分:3)

由于这些复杂性,如果你使用像csvtool这样的实际CSV解析器,它可能会容易得多:

$ csvtool col 3 - <<< '"name","content1,with commas as you see", "content2, also may contain commas", "..."'
"content2, also may contain commas"