在awk中搜索多个模式

时间:2014-11-20 19:14:44

标签: awk

我有一个包含数千行的文本文件

:ABC:xyz:1234:200:some text:xxx:yyyy:11818:AAA:BBB  
:ABC:xyz:6789:200:some text:xxx:yyyy:203450:AAA:BBB  
:EFG:xyz:11818:200:some text:xxx:yyyy:154678:AAA:BBB  
:HIJ:xyz:203450:200:some text:xxx:yyyy:154678:AAA:BBB  
:KLM:xyz:7777:200:some text:xxx:yyyy:11818:AAA:BBB  
.....   
....   
:DEL:xyz:1234:200:some text:xxx:yyyy:203450:AAA:BBB  

我需要找到第9列不止一次出现,即o / p应显示

:ABC:xyz:1234:200:some text:xxx:yyyy:11818:AAA:BBB  
:KLM:xyz:7777:200:some text:xxx:yyyy:11818:AAA:BBB  

:ABC:xyz:6789:200:some text:xxx:yyyy:203450:AAA:BBB  
:DEL:xyz:1234:200:some text:xxx:yyyy:203450:AAA:BBB

我试过了:

awk -F ":" '$9 > 2 {split($0,a,":"); print $0}' 

这会打印所有记录。

3 个答案:

答案 0 :(得分:3)

awk -F':' 'NR==FNR{cnt[$9]++;next} cnt[$9]>1' file file

或者如果您不想解析文件两次:

awk -F':' 'cnt[$9]++{printf "%s", prev[$9]; delete prev[$9]; print; next} {prev[$9]=$0 ORS}' file

答案 1 :(得分:1)

这应该在纯awk中完成:

awk -F":" '{if( s[$9] ){ print } else if( f[$9] ){ print f[$9]; s[$9]=1; print }; f[$9]=$0 }'

说明:

  • “f”数组存储至少发生过一次的第9列的值。
  • “s”数组存储已发生两次或更多次的第9列的值。
  • 如果之前发生了第9列,则打印第一个匹配项和此行。
  • 如果第9列之前发生过两次或更多次,请打印此行。

答案 2 :(得分:0)

这是另一个awk

awk -F: '{++a[$9];b[NR]=$0} END {for (i=1;i<=NR;i++) {split(b[i],c,":");if (a[c[9]]>1) print b[i]}}' file