在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,但要知道他使用的是什么环境。