提取具有相同第二列但不同第三列的行

时间:2016-01-19 14:31:05

标签: sorting unix awk count

我有一个包含3列字符串的文件,如下所示。

a b x
a b y
a b z
a c x
a d y

我想提取具有相同第二列但不同第三列的所有行。我期望上面例子的输出是

a b x
a b y
a b z

我尝试过uniq -f2并对-u -k2进行排序,但它并没有像我预期的那样工作。请给我任何建议。

2 个答案:

答案 0 :(得分:2)

awk '
    seen[$2]++ {
        if (!seen[$2,$3]++) {
            printf "%s%s\n", first[$2], $0
        }
        delete first[$2]
        next
    }
    { first[$2] = $0 ORS }
' file
a b x
a b y
a b z

请注意,上述内容适用于任何awk,对于输入文件中的任何值,不会将整个输入文件保留在内存中,不依赖于任何外部工具进行前/后处理,以及将以与输入中出现的顺序完全相同的顺序生成输出行。

答案 1 :(得分:1)

awk救援!

Need to make sure all records are unique first

$ sort file | uniq | 
  awk '{c[$2]++; a[$2]=a[$2]?a[$2]RS$0:$0}
    END{for(k in a) if(c[k]>1) print a[k]}'

a b x
a b y
a b z

说明:保留第二个字段出现的计数器并聚合记录。最后打印计数器大于1的记录。