在awk中搜索多个模式

在awk中搜索多个模式,awk,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:s

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

: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}' 
这会打印所有记录

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
或者,如果不想对文件进行两次分析:

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

这应该在纯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列以前出现过两次或两次以上,请打印此行

    • 这应该在纯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列以前出现过两次或两次以上,请打印此行

        • 这里是另一个
          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
          
          awk-F:'{++a[$9];b[NR]=$0}END{for(i=1;i1)打印b[i]}'文件
          
          这里是另一个
          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
          
          awk-F:'{++a[$9];b[NR]=$0}END{for(i=1;i1)打印b[i]}'文件
          
          您的第9个字段显示为“AAA”。它们从1开始编号。程序会执行预期的操作…$0表示整行。有时,将模式写为2.0<(0.0+$9)是很有用的,这样就不会将其作为字符串comparison@user1666959您确实忘记了
          前面有一个字段,所以第九个字段是数字。您是对的。不会影响评论的其余部分。awk将其视为字符串比较。OP的代码令人困惑,拆分不相关(即“a”没有发生任何变化)…因此我只是加入了一些想法。您的第9个字段似乎是“AAA”。它们从1开始编号。程序会执行预期的操作…$0表示整行。有时,将模式写为2.0<(0.0+$9)是很有用的,这样就不会将其作为字符串comparison@user1666959您确实忘记了
          前面有一个字段,所以第九个字段是数字。您是对的。不会影响评论的其余部分。awk将其视为字符串比较..而OP的代码令人困惑,拆分是不相关的(即“a”没有发生任何变化)…因此我只是提出了一些想法。简单而漂亮:)。在某些UNIX shell中,您可以将
          文件
          编写为
          文件{,}
          @Jotne yes,但要知道他使用的是什么环境。简单而漂亮:)。在某些UNIX shell中,您可以将
          文件
          编写为
          文件{,}
          @Jotne yes,但要知道他使用的是什么环境。