AWK解析CSV,从单元格中提取子字符串,并使用提取的值添加新列

AWK解析CSV,从单元格中提取子字符串,并使用提取的值添加新列,csv,awk,Csv,Awk,AWK解析CSV,从单元格中提取子字符串并添加新列。如果没有匹配模式(即没有要提取的子字符串),则将空白单元格添加到CSV 源数据(3个示例列,实际数据为20多个列) 尝试的代码 awk -F, -v OFS=, ' NR>1 {$4=match($3,/OPERATINGSYSTEM=[^&]*/)} 1' 所需的输出数据(新列,即使结果为空) 使用GNUawk: 您可以将匹配结果保存在数组a中,并以a[1]的形式访问正则表达式括号内匹配的元素。数组参数是一个ga

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


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

尝试的代码

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

您的任何双引号字段都可以包含逗号、换行符或转义双引号吗?@EdMorton是的,这些值可能包含逗号,它们不会有新的换行符确认解决方案与GNU AWK一起工作(GAWK)。是否可以修改ELSE IF以检查文件头行/第一行是否打印操作系统?在整个数据集上运行时出现意外错误。有时,OPERATINGSYSTEM=是字符串的最后一个,存储到数组中的匹配值包含结束的
引号-这会损坏CSV文件。
"col1txtA","col2txtA","TYPE=ARRAY&ID=111&OPERATINGSYSTEM=WINDOWS%2010&DATE=0000","WINDOWS%2010"
"col1txtB","col2txtB","TYPE=ARRAY&ID=112&DATE=0000",""
awk -F',' -v OFS=',' '
{
  if (match($3, /OPERATINGSYSTEM=([^&]*)/, a)){
    $(NF+1)="\"" a[1] "\""
  }
  else {
    $(NF+1)="\"\""
  }
}
1' input.csv