awk FPAT忽略csv中的逗号

时间:2019-12-01 17:15:02

标签: csv awk sed

Sample.csv数据

"2-Keyw-Bllist, TerrorViolencetest",vodka,ZETA+GLOBAL 4(ID: ZETA+GLOBAL),,105629,523,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,Captify (ID: Captify),,94676,884,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,QuantCast (ID: QuantCast),,46485,786,flag
TerrorViolencetest,germany,QuantCast (ID: QuantCast),,31054,491,flag
EY-Keyword-Blacklist,BBQ,MIQ+RON (ID: MIQ+RON),,26073,149,flag
TerrorViolencetest,chips,Captify (ID: Captify),,23737,553,flag
"2-Keyw-Bllist, TerrorViolencetest",bacon,QuantCast (ID: QuantCast),,17461,241,flag
VurityAdult-1test,cracks,Captify (ID: Captify),,17325,358,flag
VurityAdult-1test,pizza+grills,Captify (ID: Captify),,15173,41,flag

所需的输出

"2-Keyw-Bllist, TerrorViolencetest",vodka,ZETA+GLOBAL (ID: ZETA+GLOBAL),105629,523,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,Captify (ID: Captify),94676,884,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,QuantCast (ID: QuantCast),46485,786,flag
TerrorViolencetest,germany,QuantCast (ID: QuantCast),31054,491,flag
EY-Keyword-Blacklist,BBQ,MIQ+RON (ID: MIQ+RON),26073,149,flag
TerrorViolencetest,chips,Captify (ID: Captify),23737,553,flag
"2-Keyw-Bllist, TerrorViolencetest",bacon,QuantCast (ID: QuantCast),17461,241,flag
VurityAdult-1test,cracks,Captify (ID: Captify),17325,358,flag
VurityAdult-1test,pizza+grills,Captify (ID: Captify),15173,41,flag

问题

我有7列数据,并且能够打印/删除所需输出(如果可行)所需的列。但是,由于第1列中的数据中间存在逗号,awk认为我有7列以上,因此当我尝试删除第4列时,它会删除值,因为某些行被分流到他们不应该的列。

我尝试过的东西

  • 我尝试通过管道传递csvtool的结果(它可以正确确认列),并使用sed/awk将逗号分隔为其他内容。我猜这失败了,原因是其他命令不了解csvtool对列的了解。
  • 我曾尝试使用awk的FPAT,但是通过在线工作,我可以获得所需的输出,但是我的脚本似乎只显示数据的最后一行。

awk -F"," -v OFS=',' 'BEGIN {FPAT = "([^,]*)|(\"[^\"]+\")"} END {print $1,$2,$3,$5,$6,$7}' sample.csv

有人知道当我删除列时更容易理解我的列的方法吗?或者FPAT是唯一的解决方法,而我却错过了所做的事情吗?

1 个答案:

答案 0 :(得分:2)

请您尝试以下。

awk -F"," -v OFS=',' 'BEGIN{FPAT="([^,]*)|(\"[^\"]+\")"} {print $1,$2,$3,$5,$6,$7}' Input_file

或者更好地利用BEGIN:)

awk 'BEGIN{FS=OFS=",";FPAT="([^,]*)|(\"[^\"]+\")"} {print $1,$2,$3,$5,$6,$7}' Input_file

为什么OP的代码会部分起作用:因为您正在使用END块并打印所有内容,所以这就是它打印最后一行的原因(尽管在awk AFAIK中很少有定义此行为) )。 END块的工作方式是:

awk中有3个主要块:

  1. BEGIN块:在读取任何Input_file之前运行,重要的是,当您要初始化变量时,我们可以在程序开始读取实际Input_file之前进行操作。
  2. {...}主块:现在是将读取所有Input_file记录(行)的主块。
  3. END块:任何END程序的awk块都在读取完整的Input_file的程序完成后执行,因此所有类型的计算,例如->数组,打印最后一个值处理完完整的Input_file之后,将在这里完成。

man awk说:

  

最后,在所有输入都用完之后,gawk将执行以下代码:   END规则(如果有)。