需要您的帮助!
我有一个输入文件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“
谢谢。文基
答案 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
让我知道这是否适合您吗?