我想只提取第2列中由第2列中至少2个唯一值共享的值。
使用相同的输入(在本例中为3个制表符分隔的列):
waterline-n below-sheath-v 14.8097
dock-n below-sheath-v 14.5095
waterline-n below-steel-n 11.0330
picnic-n below-steel-n 12.2277
wavefront-n at-part-of-variance-n 18.4888
wavefront-n between-part-of-variance-n 17.0656
audience-b between-part-of-variance-n 17.6346
game-n between-part-of-variance-n 14.9652
whereabouts-n become-rediscovery-n 11.3556
whereabouts-n get-tee-n 10.9091
对于以下所需的输出:
waterline-n below-sheath-v 14.8097
dock-n below-sheath-v 14.5095
waterline-n below-steel-n 11.0330
picnic-n below-steel-n 12.2277
wavefront-n between-part-of-variance-n 17.0656
audience-b between-part-of-variance-n 17.6346
game-n between-part-of-variance-n 14.9652
是否可以使用grep执行此操作?
答案 0 :(得分:2)
使用awk
并使用数组读取文件两次
我认为仅使用grep
很难做到。
awk 'FNR==NR {a[$2]++;next} a[$2]>1' file file
waterline-n below-sheath-v 14.8097
dock-n below-sheath-v 14.5095
waterline-n below-steel-n 11.0330
picnic-n below-steel-n 12.2277
wavefront-n between-part-of-variance-n 17.0656
audience-b between-part-of-variance-n 17.6346
game-n between-part-of-variance-n 14.9652
在第一次传递FNR==NR
中,它将第2列的所有值添加到数组中,并为每次传递的命中数增加它。
在第二遍中,它查看数组并查看命中数是否超过一个,如果正常,则打印该行。
答案 1 :(得分:1)
您可以使用grep
和uniq
获得所需的输出。请注意,第二列与其他列之间不应该存在对应关系。另请注意,除非您对cut
:
grep -f <(cut -f2 infile | uniq -d) infile
输出:
waterline-n below-sheath-v 14.8097
dock-n below-sheath-v 14.5095
waterline-n below-steel-n 11.0330
picnic-n below-steel-n 12.2277
wavefront-n between-part-of-variance-n 17.0656
audience-b between-part-of-variance-n 17.6346
game-n between-part-of-variance-n 14.9652