【问题标题】:How to parse the content with a specific column in a csv file on bash如何在bash上使用csv文件中的特定列解析内容
【发布时间】:2013-06-07 08:51:06
【问题描述】:

我正在尝试逐行解析一个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的内容是错误的,它在每列中混合了逗号。那么我应该如何拆分每列中包含逗号的格式呢?

【问题讨论】:

    标签: bash csv multiple-columns


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      awk 中,我们通常使用FS 来定义字段不是什么,而不是字段是什么。在这种特殊情况下,我们真的想通过它们是什么来定义字段,FPAT 允许我们这样做。

      【讨论】:

      • 嗯,好像也不起作用,该列仍然与内容中的逗号混淆。我可能需要逐行处理它们。
      • 您需要GNU awk 4 或更高版本。
      猜你喜欢
      • 2011-05-16
      • 2019-09-27
      • 1970-01-01
      • 2014-10-09
      • 2019-05-03
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多