0

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

4

2 回答 2

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 列的所有值添加到数组中,并为每次通过的命中增加它。
在第二遍中,它查看数组并查看命中是否超过一,如果确定,则打印该行。

于 2013-10-31T12:17:34.363 回答
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
于 2013-10-31T12:22:44.667 回答