【问题标题】:Split CSV files through awk, with separator used within a string [duplicate]通过awk拆分CSV文件,在字符串中使用分隔符[重复]
【发布时间】:2019-07-23 13:15:56
【问题描述】:

我有一个 CSV 文件需要拆分,以提取每条记录的 ith 列值。

这是一个示例file.csv

Column1,Column2,Column3
"value1_1_a, value1_1_b",value1_2,value1_3
"value2_1_a, value2_1_b, value2_1_c",value2_2,value2_3

一般来说,如果我想提取(例如)Column2 值,我会选择如下命令:

cat file.csv | awk -F, '{print $2}'

得到如下结果:

Column2
value1_2
value2_2

尽管如此,由于Column1 值包含具有可变编号, 分隔符的字符串,因此我得到了错误的数据。因此,我该如何使用awk 来实现我的目的?

【问题讨论】:

  • 如果只有第一列存在嵌入分隔符的问题,并且所有记录具有相同数量的字段,则从NF 向后工作可能比处理FPAT 更容易。例如。 { print $(NF - 1) }
  • 感谢@jas,理论上可行,但包含字符串的列也可能位于列列表的中间。

标签: string bash csv awk separator


【解决方案1】:

除非您必须使用awk,否则您可以使用csvtool 为您完成这项工作,它允许引用列的名称或编号 - http://colin.maudry.com/csvtool-manual-page/

csvtool namedcol Column2 csvfile

Column2
value1_2
value2_2

csvtool col 2 csvfile

Column2
value1_2
value2_2

或者您可以使用awk 字段模式代替字段分隔符模式:

cat csvfile | awk -vFPAT='[^,]*|"[^"]*"' '{print $2}

Column2
value1_2
value2_2

【讨论】:

  • 谢谢。仅通过awk 或其他标准工具(如sed)的任何方式?
  • 检查 GNU Awk 4 扩展示例的更新。
  • 在哪里可以下载csvtool 之外的apt?例如对于非 Linux 系统很有用。
  • 适用于哪个系统?您还可以使用 pip 使用 csvkit,它可以通过 python 安装在 Windows 上 - csvkit.readthedocs.io/en/latest/index.html
  • 对于 macOS。现在,我已经通过删除字符串列内容解决了,使用以下命令:cat file.csv | sed 's/\".*\"/removed\_text/'。虽然这适用于我的具体情况,但它不是一个好的通用解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
相关资源
最近更新 更多