如何使用awk打印重复超过12次的重复记录。
输入:
1|abc123
2|abc123
3|abc123
4|abc123
5|abc123
6|abc123
7|abc123
8|abc123
9|abc123
10|abc123
11|abc123
12|abc123
13|cde456
14|xyz321
15|jkl245
16|abc123
17|abc123
18|abc123
19|def567
20|abc123
预期输出:
1|abc123
2|abc123
3|abc123
4|abc123
5|abc123
6|abc123
7|abc123
8|abc123
9|abc123
10|abc123
11|abc123
12|abc123
15|abc123
16|abc123
17|abc123
18|abc123
20|abc123
我尝试了下面的命令,但没有得到确切的输出。
awk -F'|' 'NR==FNR{cnt[$2]++; next} cnt[$2]>12' input > output
答案1
如果您双重解析文件,您的命令将会很好,例如:
awk -F'|' 'FNR==NR{c[$2]++;next} c[$2]>12' input input > output
在第一遍中,您计算出现次数,在第二遍中,您仅打印c>12
。它的内存效率也很高。原始文件的行顺序也受到尊重。如果您愿意,您可以轻松执行任何排序。
顺便说一句,您当前的输入示例中没有任何行出现超过 12 次。abc123
出现的12
时间正好。此外,这些事件之一中有一个尾随空白,7|abc123
这意味着不同的第二个字段。
答案2
假设您实际上的意思是“2 或更多”而不是“超过 2”,因为这是您显示的输出,您可以使用 GNU 核心工具和一些 sed 获得所需的输出:
$ sed 's/ *$//' file | tr '|' ' ' | sort -t ' ' -k 2 | uniq -Df1 | tr ' ' '|'
3|6W0Q3WKP3DZ
6|6W0Q3WKP3DZ
10|81TE22WWDEDCVXBAQ6F20Z86GFW
7|81TE22WWDEDCVXBAQ6F20Z86GFW
9|81TE22WWDEDCVXBAQ6F20Z86GFW
2|BWDY6IGYBDTMAVQA
5|BWDY6IGYBDTMAVQA
1|PTPX9L1Y31QEL55H
4|PTPX9L1Y31QEL55H
sed 's/ *$//' file
:删除大多数行末尾的多余空格,然后tr '|' ' '
: 将 替换|
为空格,然后sort -t ' ' -k 2
:对第二个空格分隔的字段进行排序,然后uniq -Df1
:检查重复项时仅保留重复行 (-D
) 并忽略第一个字段 ( );-f1
然后tr ' ' '|'
:再次将空格转换回原样|
。