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

我想根据第 2 列获得唯一的行。我已经完成了

cat file | cut -f 2 | uniq > grepfile

但我不确定现在如何grep -f像以前一样使用每行匹配一个。使用-m1 or | head -n 1仅给出第一个匹配行。我希望第一行匹配“grepfile”中的每一行。

期待答案=)

4

4 回答 4

6

这个 awk 命令通过构建一个已经见过的第二字段值的关联数组来工作。

awk '!s[$2]++'

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

只需注意行数何时足够大以再次回绕到 0。

于 2012-07-02T11:29:06.687 回答
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)进行排序,如排序手册页所示。

于 2012-07-02T11:46:08.927 回答
0

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

perl -nale '$h{$F[1]}=$_ if(!$h{$F[1]});END{print $h{$_}for(keys(%h));}' file
于 2012-07-02T11:17:04.997 回答
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删除字段 2 上的重复项。注意:键号高一,因为cat -n.
  3. sort放回原来的顺序。
  4. cut -f2-获取序列号的钻机。
于 2012-07-02T11:57:38.783 回答