grep -f只返回第一个匹配(很多)

时间:2012-07-02 11:06:33

标签: unix command-line grep

尝试从命令行中获取更多信息:

我有一个文件:

CHR25   1192279 Y       Exonic  NA      exon    2       [1/1]   1192145 1192322
CHR25   1192279 Y       Exonic  NA      CDS     2       [1/1]   1192145 1192322  
CHR25   1739394 Y       Exonic  NA      CDS     2       [1/2]   1739294 1739456

我希望根据第2列获得独特的行。我已经完成了

cat file | cut -f 2 | uniq > grepfile

但我不确定如何使用grep -f每行获得一个匹配,就像我之前一样。使用-m1 or | head -n 1仅提供第一个匹配行。我希望第一行匹配'grepfile'中的每一行。

期待答案=)

4 个答案:

答案 0 :(得分:6)

这个awk命令的工作原理是构建一个已经看过的第二个字段值的关联数组。

awk '!s[$2]++'

关联数组称为s。该表达式查找$ 2(输入行的第二列)并应用一个postincrement,它将在第一次调用时返回0,之后返回非零值。然后我反转它,第一次看到每个$ 2产生1,然后每次产生0。如果选择表达式为真,则awk的默认操作是打印。

当线数大到足以再次回到0时,请注意。

答案 1 :(得分:2)

这也可以:

sort -u  -k2,2 file

,并提供:

CHR25   1192279 Y       Exonic  NA      exon    2       [1/1]   1192145 1192322
CHR25   1739394 Y       Exonic  NA      CDS     2       [1/2]   1739294 1739456

-u调用uniq-k2,2表示排序字段2(仅限字段2),可以在排序man page上看到。

答案 2 :(得分:0)

如果Perl没问题,你可以这样做:

perl -nale '$h{$F[1]}=$_ if(!$h{$F[1]});END{print $h{$_}for(keys(%h));}' file

答案 3 :(得分:0)

因为uniq只查看相邻的行,并且排序会更改顺序。你需要更多的代码。

cat -n input-file | sort --key=3,3 --unique | sort | cut -f2- >output-file
  1. cat -n添加序列号。
  2. sort --key=3,3 --unique删除字段2上的重复项。注意:由于cat -n,密钥编号高一个。
  3. sort按原始顺序退回。
  4. cut -f2-获取序列号的数据。