如何在Bash中解析CSV文件中特定列的内容

4

我正在尝试逐行解析一个csv文件,其格式类似于以下内容:

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

我想获取特定列的内容,不包括引号。例如:第一列和第三列。所期望的内容应为:

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个回答

3
如果您拥有GNU awk,那么FPAT将会帮助您解决问题。
gawk '{print $1,$3}' FPAT="([^,]+)|(\"[^\"]+\")" my.csv

awk 中,我们通常使用 FS 定义字段是什么,而不是字段不是什么。但在这种情况下,我们确实想要根据字段的内容定义它们,FPAT 正好允许我们这样做。

嗯,看起来还是不行,列仍然会因内容中的逗号而混淆。我可能需要逐行处理它们。 - Qingshan Zhang
你需要 GNU awk 4 版本或更高版本。 - jaypal singh

3

由于存在这些复杂性,如果您使用实际的CSV解析器(如csvtool),可能会更容易:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接