AWK在第3列中查找重复值。打印整行

时间:2018-04-04 16:53:13

标签: awk

为什么这不起作用?我已经找了很久,发现了一些非常复杂的解决方案,但我认为这可以简化并重复使用......悲伤:'(

声明

awk -F"\t" '!seen[$3]++'

文件

r1c1    r1c2    r1c3
r2c1    r2c2    r2c3
r3c1    r3c2    r3c3
r4c1    r4c2    r3c3
r5c1    r5c2    r5c3

所需输出

r3c1    r3c2    r3c3
r4c1    r4c2    r3c3

代码添加0和1。

[user@host]$ awk '{a[$3]=a[$3] $0 RS c[$3]++} END {for (i in c) if (c[i]>1) printf "%s",a[i]}' file
r3c1    r3c2    r3c3
0r4c1   r4c2    r3c3
1[jcole@dukescri01 srlg]$ 

3 个答案:

答案 0 :(得分:2)

以下awk版本也可以帮助您(如果您希望获得与Input_file本身相同的输出顺序)。

awk 'FNR==NR{a[$3]++;next} a[$3]>1'  Input_file  Input_file

编辑:

awk '{++a[$3];b[$3]=b[$3]?b[$3] ORS $0:$0}END{for(i in a){if(a[i]>1){print b[i]}}}'   Input_file

答案 1 :(得分:1)

只需使用 uniq 命令:

uniq -f2 -D file
  • -f N - 避免比较第一个N字段
  • -D - 打印所有重复的行

输出:

r3c1    r3c2    r3c3
r4c1    r4c2    r3c3

如果文件未排序:

sort -k3 file | uniq -f 2 -D

答案 2 :(得分:1)

在awk中,将记录存储为哈希的一遍版本:

$ awk '
{
    a[$3]=a[$3] $0 RS        # store records
    c[$3]++                  # counter
}
END {
    for(i in c)
        if(c[i]>1)           # pick the ones with duplicates
            printf "%s",a[i]
}' file
r3c1    r3c2    r3c3
r4c1    r4c2    r3c3