【问题标题】:AWK parse CSV, extract substring from cell and add new column with extracted valueAWK 解析 CSV,从单元格中提取子字符串并添加具有提取值的新列
【发布时间】:2019-12-28 12:30:34
【问题描述】:

AWK 解析 CSV,从单元格中提取子字符串并添加新列。如果没有匹配的模式(即没有要提取的子字符串),请将空白单元格添加到 CSV。


源数据(3 列示例,实际数据为 20+ 列)

"col1txtA","col2txtA","TYPE=ARRAY&ID=111&OPERATINGSYSTEM=WINDOWS%2010&DATE=0000"
"col1txtB","col2txtB","TYPE=ARRAY&ID=112&DATE=0000"

尝试的代码

awk -F, -v OFS=, '
  NR>1
  {$4=match($3,/OPERATINGSYSTEM=[^&]*/)}
  1'

所需的输出数据(新列,即使结果为空白)

"col1txtA","col2txtA","TYPE=ARRAY&ID=111&OPERATINGSYSTEM=WINDOWS%2010&DATE=0000","WINDOWS%2010"
"col1txtB","col2txtB","TYPE=ARRAY&ID=112&DATE=0000",""

【问题讨论】:

  • 您的任何双引号字段是否可以包含逗号、换行符或转义的双引号?
  • @EdMorton 是的,值可能包含逗号,它们不会有新行

标签: csv awk


【解决方案1】:

使用 GNU awk:

您可以将匹配结果保存在数组a 中,并以a[1] 访问正则表达式括号内匹配的元素。数组参数是一个 gawk 扩展。

awk -F',' -v OFS=',' '
{
  if (match($3, /OPERATINGSYSTEM=([^&]*)/, a)){
    $(NF+1)="\"" a[1] "\""
  }
  else {
    $(NF+1)="\"\""
  }
}
1' input.csv

【讨论】:

  • 确认解决方案适用于 GNU AWK (GAWK)。是否可以修改 ELSE IF 以检查文件的标题行/第一行是否打印 OPERATINGSYSTEM?
  • 在整个数据集上运行时出现不可预见的错误。有时 OPERATINGSYSTEM= 是字符串的最后一个,并且存储到数组中的匹配值包含关闭的 " 引号 - 这会破坏 CSV 文件。
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2021-10-15
相关资源
最近更新 更多