Linux

在 Linux 中從 Fasta 文件中提取列

  • September 19, 2019

我有一個 fasta 文件,看起來像這樣

>ENST00000632684.1 cdna chromosome:GRCh38:7:142786213:142786224:1 gene:ENSG00000282431.1 gene_biotype:TR_D_gene transcript_biotype:TR_D_gene gene_symbol:TRBD1 description:T cell receptor beta diversity 1 [Source:HGNC Symbol;Acc:HGNC:12158]
GGGACAGGGGGC
>ENST00000434970.2 cdna chromosome:GRCh38:14:22439007:22439015:1 gene:ENSG00000237235.2 gene_biotype:TR_D_gene transcript_biotype:TR_D_gene gene_symbol:TRDD2 description:T cell receptor delta diversity 2 [Source:HGNC Symbol;Acc:HGNC:12255]
CCTTCCTAC

我想提取gene_symbol 和描述。但不幸的是,描述之間有空格,我無法提取完整的描述。

我試過這個

cat Homo_sapiens.GRCh38.cdna.all.fa | grep ">" | cut -f 7,8 -d" "  > Human_Annotations

但這給了我這樣的輸出,其中描述被破壞了。

gene_symbol:TRBD1 description:T
gene_symbol:TRDD2 description:T

我想要這樣的輸出

TRBD1 T cell receptor beta diversity 1
TRDD2 T cell receptor delta diversity 2

嘗試這樣的事情:

cat ... | sed -n '/^>/ { s/.*description: *//; s/\[.*//; p; }'

(未經測試,因為我在手機上。)

還有更優雅的方式;例如,Awk 循環將是最靈活的。

使用awk

awk -F ':' '/^>/ { sub(" .*",    "", $10)
                  sub(" \\[.*", "", $11)
                  print $10, $11 }' file.fa

您要提取的數據是第 10 個欄位中的第一個單詞以及[每個標題行的第 11 個欄位中的所有內容(如果欄位是 -:分隔的)。

程式碼從第 10 個欄位的第一個空格以及第[11 個欄位中的所有內容(包括 the[和前面的空格)中刪除所有內容。

然後列印修改後的第 10 和第 11 欄位。

給出問題中數據的輸出:

TRBD1 T cell receptor beta diversity 1
TRDD2 T cell receptor delta diversity 2

引用自:https://unix.stackexchange.com/questions/542595