打印包含特定列中的值的行,该列由另一个列中的多个实体共享

时间:2013-10-31 11:58:11

标签: terminal grep

我想只提取第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执行此操作?

2 个答案:

答案 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)

您可以使用grepuniq获得所需的输出。请注意,第二列与其他列之间不应该存在对应关系。另请注意,除非您对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