文本处理之 uniq

本文主要介绍一下 linux 下 uniq 命令的简单用法。

总的来说,uniq 就是把重复的当作一个看待,也就是单一化。

下面通过一个小例子进行介绍

比如 文件 all.gtf:

$ less all.gtf
chr1 exon gene_id "LOC_Os01g01050";
chr1 exon gene_id "LOC_Os01g01050";
chr1 stop_codon gene_id "LOC_Os01g01050";
chr1 start_codon gene_id "LOC_Os01g01060";
chr1 exon gene_id "LOC_Os01g01060";
chr1 exon gene_id "LOC_Os01g01060";
chr1 exon gene_id "LOC_Os01g01060";
chr1 exon gene_id "LOC_Os01g01060";
chr1 stop_codon gene_id "LOC_Os01g01060";
chr1 start_codon gene_id "LOC_Os01g01070";
chr1 exon gene_id "LOC_Os01g01070";
chr1 exon gene_id "LOC_Os01g01070";
...

我们发现第4列中为基因的id, 但是由于有多个外显子,所以id很多都是重复。
现在第一个问题就是 在这个文件中有多少个 id,其中重复的算为一个?

可以利用 uniq 命令解决:

$ wc all.gtf -l
444955 all.gtf
$ cat  all.gtf | awk '{print $4}'  | sort | uniq | wc -l
55986

其中, awk '{print $4}' 指的是提取第4列
后面, sort|uniq 一般都一起使用,因为 uniq 只对相邻的重复进行处理
从结果来看, 该文件有 444955 行, 但唯一 的id 的数量只有 55986 个。

第二个问题是有多少个id 是没有重复的?

$ cat  all.gtf | awk '{print $4}'  | sort | uniq -u | wc -l 
0

其中 uniq -u 指的是只打印唯一,不重复的行
从结果来看没有一个 id 是没有重复的。

也可以这样算:

$ cat  all.gtf | awk '{print $4}'  | sort | uniq -d | wc -l
55986

其中 uniq -d 指的是只打印具有重复的行,结果也印证了上面的答案。

第三个问题是 对于每一个 id, 它有几个重复数?

$ cat  all.gtf | awk '{print $4}'  | sort | uniq -c | less
28 "LOC_Os01g01010";
  4 "LOC_Os01g01019";
  7 "LOC_Os01g01030";
 34 "LOC_Os01g01040";
 16 "LOC_Os01g01050";
  6 "LOC_Os01g01060";
 47 "LOC_Os01g01070";
 50 "LOC_Os01g01080";
 10 "LOC_Os01g01090";
  7 "LOC_Os01g01100";
  3 "LOC_Os01g01110";
  3 "LOC_Os01g01115";
...

其中 uniq -c 指的是在每一行前面加上重复数
因此,从结果可以看到,每一个 id 前面的数字就是代表了它的重复数。

posted on 2015-10-24 00:42  OA_maque  阅读(234)  评论(0)    收藏  举报

导航