Grep模式重复

时间:2012-10-22 04:13:40

标签: unix grep

我有一个csv(逗号分隔文件)。我想知道如何使用grep(不使用cut)搜索第7和第8字段相同的模式。我尝试过这样的事情:

grep -E '[^,]*,{6,6}' input.csv | grep '\(.*\)\(,\)\(\1$\)' | less

不幸的是,这不打印任何东西。我怎么能得到我需要的输出?

2 个答案:

答案 0 :(得分:3)

假设没有任何尴尬的东西,比如在其中有逗号的字段(因为如果前8个字段中有这样的字段,则无法使用完整的CSV识别工具处理文件),并且存在第9个字段(所以第7和第8个字段都后跟逗号)然后:

grep '^\([^,]*,\)\{6\}\([^,]*,\)\2' file.csv

第一位表示6个零或多个非逗号序列,每个逗号后跟一个逗号。然后是第7个(可能是空的)字段及其尾随逗号;之后又是同样的东西(\2)。

$ cat file.csv
a,b,c,d,e,f,g,g,i
a,b,c,d,e,f,g,h,i
a,b,c,d,e,f,hhh,hhh,i
,b,c,d,e,f,hhh,hhh,i
,,c,d,e,f,hhh,hhh,i
,,,d,e,f,hhh,hhh,i
,,,,e,f,hhh,hhh,i
,,,,,f,hhh,hhh,i
,,,,,,hhh,hhh,i
,,,,,,hhh,hhh,
$ grep '^\([^,]*,\)\{6\}\([^,]*,\)\2' file.csv
a,b,c,d,e,f,g,g,i
a,b,c,d,e,f,hhh,hhh,i
,b,c,d,e,f,hhh,hhh,i
,,c,d,e,f,hhh,hhh,i
,,,d,e,f,hhh,hhh,i
,,,,e,f,hhh,hhh,i
,,,,,f,hhh,hhh,i
,,,,,,hhh,hhh,i
,,,,,,hhh,hhh,
$

请注意,g,h,i行不会出现在输出中(并且不应该出现);其余的应该而且确实会出现。

所有这一切都是使用POSIX Basic Regular Expressions或BRE完成的。如果您使用egrepgrep -E,则可以使用扩展正则表达式或ERE,除了\2之外,您可以放弃所有反斜杠;你也可以处理一个包含8个字段的行和9个或更多行的其他行的文件,但这不是常规的CSV文件。还可以修改BRE版本以使用精确包含8列的CSV文件:

grep '^\([^,]*,\)\{6\}\([^,]*\),\2$' file.csv

使用正则表达式的部分技巧是具有关于实现给定结果的不同方式的灵活思维方式;通常有不止一种方法可以做到。

答案 1 :(得分:1)

如果你对awk感兴趣,那就更简单了:

awk -F, '$7==$8' your_file

或perl:

perl -F, -ane 'if($F[6]==$F[7]){print}' your_file