我有一个文件,其中包含 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 的记录。