文本處理之 uniq

本文主要介紹一下 linux 下 uniq 命令的簡單用法。linux

總的來講,uniq 就是把重複的看成一個看待,也就是單一化。less

下面經過一個小例子進行介紹code

好比 文件 all.gtf:awk

$ 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,其中重複的算爲一個?sort

能夠利用 uniq 命令解決:top

$ 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 是沒有重複的?co

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

其中 uniq -u 指的是隻打印惟一,不重複的行
從結果來看沒有一個 id 是沒有重複的。block

也能夠這樣算:數字

$ 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 前面的數字就是表明了它的重複數。

相關文章
相關標籤/搜索