awk正则表达式:帮助匹配在双引号中包含带有逗号字段的CSV文件

时间:2019-01-01 11:24:59

标签: regex csv awk

需要您的帮助!

我有一个输入文件1.txt,如下所示:

"row1@abc.com,venki@abc.com,vr@xyz.com",field2,field3,field4
row2r@xyz.com,field2,field3,field4
field1,"row3@abc.com,venki@abc.com, vr@xyz.com",field3,field4
field1,"1111@abc.com,row4@abc.com",,field4
field1,"1111@abc.com""1234,999,row5@abc.com",,field4

我想确定没有正好四(4)列的行,并在使用copy命令将其加载到PostGres表中之前将其从文件中删除。

我正在如下使用awk:

awk -v FPAT ='([[^,] +)||(“ [^”] +“)||(^ [] * $)''{printf(” Row:%d,NF =% d,%s,%s,%s,%s \ n“,NR,NF,$ 1,$ 2,$ 3,$ 4)}'1.txt

输出是;

Row:1,NF=4, "row1@abc.com,venki@abc.com, vr@xyz.com", field2, field3, field4
Row:2,NF=4, row2r@xyz.com, field2, field3, field4
Row:3,NF=4, field1, "row3@abc.com,venki@abc.com, vr@xyz.com", field3, field4
Row:4,NF=4, field1, "1111@abc.com,row4@abc.com", , field4
Row:5,NF=6, field1, "1111@abc.com""1234, 999, row5@abc.com"

您可以在最后一行看到问题。它的值中有双引号和两个逗号,这使事情变得糟透了。该行的NF应该为4时为6。

任何人都可以建议使用正则表达式来识别值 “ 1111@abc.com”“” 1234,999,row5 @ abc.com“

谢谢。文基

1 个答案:

答案 0 :(得分:0)

解决问题的一种方法是将带引号的正则表达式部分从("[^"]+")更改为(".+"),这将使其能够捕获带引号的文本,包括逗号和双引号以及实际上任何字符。并且,交替更改正则表达式的顺序。基本上,从此更改您的正则表达式,

([^,]+)||("[^"]+")||(^[ ]*$)

(".+")||([^,]+)||(^[ ]*$)

这样,它将首先尝试捕获引用的数据(基于第一个正则表达式(".+")),并且将捕获"1111@abc.com""1234,999,row5@abc.com",因为它早先试图捕获此"1111@abc.com",因为您的正则表达式为("[^"]+"),不允许在数据中捕获任何双引号或逗号。因此,这应该可以解决您的捕获问题。

在实际运行此命令后,

awk -v FPAT='(".+")||([^,]+)||(^[ ]*$)' '{printf("Row:%d,NF=%d, %s, %s, %s, %s\n",NR, NF, $1,$2,$3,$4)}' awk.txt

在您的帖子中提到的文件数据1.txt1上,我得到了以下输出,希望该输出应该正确无误。

Row:1,NF=4, "row1@abc.com,venki@abc.com,vr@xyz.com", field2, field3, field4
Row:2,NF=4, row2r@xyz.com, field2, field3, field4
Row:3,NF=4, field1, "row3@abc.com,venki@abc.com, vr@xyz.com", field3, field4
Row:4,NF=4, field1, "1111@abc.com,row4@abc.com", , field4
Row:5,NF=4, field1, "1111@abc.com""1234,999,row5@abc.com", , field4

让我知道这是否适合您吗?