![确定8元组的重复](https://linux22.com/image/215143/%E7%A1%AE%E5%AE%9A8%E5%85%83%E7%BB%84%E7%9A%84%E9%87%8D%E5%A4%8D.png)
我有 16 个收藏,共 8 个号码
(11 12 11 44 11 12 11 23)
(12 21 11 44 11 12 11 23)
(11 42 21 13 12 21 31 14)
(11 42 21 13 12 21 11 34)
and so on
我想找出每个8元组是否有重复。数字出现的顺序并不重要。
结果将返回每个模式的出现次数。
(11 12 11 44 11 12 11 23) 1
(12 21 11 44 11 12 11 23) 1
(11 42 21 13 12 21 31 14) 2
(11 42 21 13 12 21 11 34) 1
答案1
这是一种方法。我从这个包含一些重复行的输入文件开始:
cat tupl
11 12 11 44 11 12 11 23
12 21 11 44 11 12 11 23
12 21 11 44 11 12 11 23
12 21 11 44 11 12 11 23
12 21 11 44 11 12 11 23
11 42 21 13 12 21 31 14
11 42 21 13 12 21 11 34
11 12 11 44 11 12 11 23
既然你说每行中的数字顺序并不重要,我们可以先对每行中的数字进行排序:
awk ' {split( $0, a, " " ); asort( a ); for( i = 1; i <= length(a); i++ ) printf( "%s ", a[i] ); printf( "\n" ); }' tupl
11 11 11 11 12 12 23 44
11 11 11 12 12 21 23 44
11 11 11 12 12 21 23 44
11 11 11 12 12 21 23 44
11 11 11 12 12 21 23 44
11 12 13 14 21 21 31 42
11 11 12 13 21 21 34 42
11 11 11 11 12 12 23 44
现在,您可以使用 awk 的关联数组思想通过将结果通过管道传输到此命令中来计算相同的行:
awk '{a[$0]++} END {for (i in a) print i, a[i]}'
11 12 13 14 21 21 31 42 1
11 11 11 11 12 12 23 44 2
11 11 12 13 21 21 34 42 1
11 11 11 12 12 21 23 44 4