我有一个包含三列的文件,我想按第三列获取重复的行,例如:
AAA = 342
BLABLABLA = 2
BBBx2 = 23
1+1 = 2
KOKOKO= 5
2x1 = 2
输出应该是:
BLABLABLA = 2
1+1 = 2
2x1 = 2
我尝试使用sort
and uniq
,但它删除了重复的行,我想打印它们。
答案1
只要你有兴趣最后的列,您可以使用sort
和来完成uniq
:
$ sort -k3n test.txt | uniq -f2 -D
1+1 = 2
2x1 = 2
BLABLABLA = 2
这里,排序选项-k3n
使文件从第三个字段开始按数字顺序排序;选项uniq
有:
-f2 Skip the first two fields before checking for uniqueness
-D Print all the repeated lines
不幸的是,您无法控制要检查唯一性的字段数量。您可以用来-w
指定要检查的字符数,但这只有在您感兴趣的字段是固定宽度的情况下才会有帮助。
另外,请注意尾随空格。它将包含在要检查唯一性的文本中。
答案2
使用Uniq。
uniq -f 3 <file name>
答案3
@rici 的响应是正确的,但请注意这-D
是一个 GNU 扩展
这是一个 awk 解决方案。它单次运行,但存储前一行:
sort -k3n <file name> | awk 'a[$3]++{ if(a[$3]==2){ print b }; print $0}; {b=$0}'
答案4
gawk -F'= ' '{d[$2][a[$2]++]=$0} END{for (i in a) {if (a[i] > 1) for (j in d[i]) {print d[i][j]}}}'
解释:
对于每一行 ($0),采用由“=”分隔的第二个字段 ($2),并使用该字段作为哈希“a”的键来计算该字段的出现次数,还使用该字段作为两个维度的第一个维度键维度哈希'd',以及该字段引用的哈希'a'的值作为第二维度键来存储当前行的值($)。最后循环遍历 'a' 中值大于 1 的所有元素(意味着重复)并打印 'd' 的相应值。
注意:这一行不需要排序,但会消耗内存。