文本处理之 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 前面的数字就是代表了它的重复数。
浙公网安备 33010602011771号