按列获取或过滤重复行

按列获取或过滤重复行

我有一个包含三列的文件,我想按第三列获取重复的行,例如:

AAA = 342  
BLABLABLA = 2  
BBBx2 = 23  
1+1 = 2  
KOKOKO= 5  
2x1 = 2  

输出应该是:

BLABLABLA = 2  
1+1 = 2  
2x1 = 2  

我尝试使用sortand 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' 的相应值。

注意:这一行不需要排序,但会消耗内存。

相关内容