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



我有一个文件,其中包含 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,但它没有像我预期的那样工作。请提出任何建议。

awk '
    seen[$2]++ {
        if (!seen[$2,$3]++) {
            printf "%s%sn", first[$2], $0
        }
        delete first[$2]
        next
    }
    { first[$2] = $0 ORS }
' file
a b x
a b y
a b z
请注意,对于输入文件中的任何值,上述方法将适用于任何awk,不会将整个输入文件保留在内存中,

不依赖任何外部工具进行预/后处理,并且将生成输出行与它们在输入中出现的顺序完全相同。

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 的记录。

最新更新