无论引用的字段在哪里,这个 awk 都应该可以工作,并且也可以在转义的引号上工作。
awk '{while(match($0,/"[^"]+",|([^,]+(,|$))/,a)){
$0=substr($0,RSTART+RLENGTH);b[++x]=a[0]}
print b[1] b[4];x=0}' file
输入
"abc@xyz.com,www.example.com",field2,field3,field4
"def@xyz.com",field2,field3,field4
field1,"abc@xyz.com,www.example.com",field3,field4
输出
"abc@xyz.com,www.example.com",field4
"def@xyz.com",field4
field1,field4
它甚至适用于
field1,"field,2","but this field has ""escaped"\" quotes",field4
强大的 FPAT 变量失败了!
说明
while(match($0,/"[^"]+",|([^,]+(,|$))/,a))
启动一个 while 循环,只要匹配成功(即有一个字段),该循环就会继续。
匹配匹配第一次出现的正则表达式,该正则表达式偶然匹配字段并将其存储在数组a
$0=substr($0,RSTART+RLENGTH);b[++x]=a[0]
将$0 设置为从匹配字段的末尾开始,并将匹配的字段添加到b 中的相应数组位置。
print b[1] b[4];x=0}
从b 打印您想要的字段,并将下一行的 x 设置为零。
缺陷
如果字段同时包含转义引号和逗号,则会失败
编辑
更新以支持空字段
awk '{while(match($0,/("[^"]+",|[^,]*,|([^,]+$))/,a)){
$0=substr($0,RSTART+RLENGTH);b[++x]=a[0]}
print b[1] b[4];x=0}' file