grep -f 只返回第一个匹配项(而不是所有匹配项)

3
尝试从命令行中获取更多信息:
我有一个文件:
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

我希望根据第二列获取唯一行,我已经完成了。
cat file | cut -f 2 | uniq > grepfile

我不确定如何使用grep -f来使每行只匹配一个结果,因为之前我已经使用过了。使用-m1或| head -n 1只会给出第一个匹配的结果。我希望第一行与'grepfile'中的每一行都匹配。

期待您的回答=)


1
你只需要示例中的第一行和第三行吗?还是第二行和第三行?这有关系吗? - Alan Curry
1
从问题中不清楚你想要实现什么。请根据您已经提供的样本输入文件添加您想要获得的最终输出,我相信我们一定能够帮助您。 - Rob Kielty
我想我明白了。这是awk的工作。awk'!s[$2]++' - Alan Curry
我只想获取“grepfile”中每行的第一个匹配项。 - bruce01
@AlanCurry 这个很好用,真的需要学习一下 awk。 - bruce01
显示剩余4条评论
4个回答

6
这个awk命令的作用是构建一个关联数组,其中存储已经出现过的第二个字段的值。
awk '!s[$2]++'

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

只要注意当行数足够大而再次回到0时。


+1 对于 awk .. 需要注意的是,如果您使用 csh/tcsh,则需要转义 !,因此 awk '\!s[$2]++' 将起作用。 - Levon
+1 很棒的解决方案,但是多花一些字符来使解释冗余并避免溢出怎么样?awk 's[$2]==0 { s[$2]=1; print }' - Jo So

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 表示按照第二个字段排序(只按照第二个字段),详情请参看 sort 命令的 man 手册


-u和--unique表示唯一,就像uniq命令一样。但是不会调用uniq命令。 - ctrl-alt-delor
@richard 没错,谢谢你指出来。我应该更仔细地查看手册,我只看到了 uniq* :) - Levon
@user1495853 您好,欢迎您。如果这个页面上的任何解决方案对您有帮助,请随意为它们投票。并考虑选择您最喜欢的答案,并通过单击答案旁边的复选标记接受它。这将奖励双方一些声望点,并标记此问题已解决。 - Levon

0
如果您使用Perl,可以这样做:

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

我本可以用 Perl 来完成(需要更多代码行),但我想尝试使用命令行。谢谢。 - bruce01
我可以用 Perl 几乎和 Awk 一样的方式来完成它:perl -nae 'print if !$s{$F[1]}++' - Alan Curry

0

因为uniq只查看相邻的行,而sort会改变顺序。你需要更多的代码。

cat -n input-file | sort --key=3,3 --unique | sort | cut -f2- >output-file
  1. 使用cat -n添加序列号。
  2. 使用sort --key=3,3 --unique在第二个字段上删除重复项。注意:键号比cat -n高1。
  3. 使用sort将其放回原始顺序。
  4. 使用cut -f2-去掉序列号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接