我有一个包含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进行排序,但它并没有像我预期的那样工作。请给我任何建议。
答案 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的记录。