Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix grep-f仅返回第一个匹配(许多匹配中)_Unix_Command Line_Grep - Fatal编程技术网

Unix grep-f仅返回第一个匹配(许多匹配中)

Unix grep-f仅返回第一个匹配(许多匹配中),unix,command-line,grep,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] 1

试图从命令行中获得更多信息:

我有一个文件:

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或| head-n1
仅给出第一条匹配行。我希望第一行与“grepfile”中的每一行匹配


期待答案=)

如果Perl还可以,您可以:

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

此awk命令通过构建已看到的第二个字段值的关联数组来工作

awk '!s[$2]++'
关联数组称为
s
。表达式查找$2(输入行的第二列)并应用postincrement,它将在第一次调用时返回0,之后返回非零。然后我将其反转,第一次看到每个$2时收益率为1,之后每次收益率为0。awk的默认操作是在选择表达式为true时打印

当行计数足够大,可以再次环绕到0时,请注意。

这也会起作用:

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)。

因为uniq只查看相邻行,排序会改变顺序。你需要多一点代码

cat -n input-file | sort --key=3,3 --unique | sort | cut -f2- >output-file
  • cat-n
    添加序列号
  • sort--key=3,3--unique
    删除字段2上的重复项。注意:由于
    cat-n
    ,钥匙号高一个
  • 排序
    以恢复原始顺序
  • cut-f2-
    获取序列号

  • 那么您只需要示例中的第一行和第三行?还是第二和第三?哪一个重要吗?从这个问题上看,你想要实现什么并不清楚。根据您已经提供的示例输入文件添加您想要得到的最终输出,我相信我们能够提供帮助。我想我已经得到了。这是awk的工作<代码>awk'!s[$2]+'我只想为
    grepfile
    @AlanCurry中的每一行获得第一个匹配项,它工作得很好,我真的需要知道awkI可以在Perl中完成它(有更多的行),但我正在尝试使用命令行。不过还是要谢谢你。我可以用perl做这件事,几乎和我在awk中做的一样:
    perl-nae'print if$s{$F[1]}++'
    +1代表
    awk
    。。需要注意的是,如果使用
    csh/tcsh
    ,则需要退出
    ,所以
    awk'\!s[$2]+'
    将起作用。+1很好的解决方案,但是如果多花几个字符使解释变得多余并避免溢出,该怎么办
    awk的[$2]==0{s[$2]=1;print}'
    -u和--unique表示unique,比如uniq。但是uniq命令没有被调用。@richard对,你是。。谢谢你指出这一点。我应该更仔细地查看手册页,我刚刚看到uniq*:)@user1495853不客气。如果本页上的任何解决方案有助于提高投票率,请随意投票。考虑选择你喜欢的和答案旁边的。这将奖励双方一些代表点,并将此问题标记为已解决。