如果大于12次如何打印重复记录?

如果大于12次如何打印重复记录?

如何使用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 ' ' '|':再次将空格转换回原样|

相关内容