2015-02-23 106 views
1

我有什麼應該是一個簡單的問題,但是我缺乏awk知識讓我失望。在使用awk的fasta頭文件中的分隔符後保留文本

我想清理FASTA文件,它是在這種格式的標頭:

>HWGG454_Clocus2_Locus3443_allele1 
ATTCTACTACTACTCT 
>GHW757_clocus37_Locus555662_allele2 
CTTCCCTACGATG 
>TY45_clocus23_Locus800_allele0 
TTCTACTTCATCT 

我想清理每個報頭(開頭的行「>」)只保留信息部分,這是第二個「_Locus *」,有或沒有等位基因部分。

我認爲awk會是這樣做的簡單方法,但我無法完成它的工作。我想運行這個(假設這個玩具的例子在文件test.fasta中):

cat test.fasta | awk -F '_' '{print $1}' 

>HWGG454 
ATTCTACTACTACTCT 
>GHW757 
CTTCCCTACGATG 
>TY45 
TTCTACTTCATCT 

但是,我要的是留住只是「軌跡*」的文字,這是第3次分隔符之後,但是,使用這種代碼我得到這個:

cat test.fasta | awk -F '_' '{print $3}' 
Locus3443 

Locus555662 

Locus800 

我在做什麼錯在這裏?

謝謝。

+0

什麼是您預期的輸出? – anubhava 2015-02-23 18:37:19

回答

1

我明白這意味着您要從標題行中選擇Locus字段,並保持其他字段不變。然後:

awk -F _ '/^>/ { print $3; next } 1' filename 

也許是最簡單的方法。這種工作方式如下:

/^>/ {  # in lines that begin with > 
    print $3 # print the third field 
    next  # and go to the next line. 
} 
1   # print other lines unchanged. Here 1 means true, and the 
      # default action (unchanged printing) is performed. 

瞭解這裏的事情是awk的控制流:AWK代碼由具有關聯操作的條件,如果條件計算爲真執行的操作。

/^>/是整個記錄的正則表達式匹配(默認爲行);它是真實的,如果符合>(因爲^比賽開始時)開始,所以

/^>/ { print $3; next } 

將AWK在與>開頭的行執行print $3; next。不那麼簡單的部分是

1 

其中打印行不變。如果第一個動作未被執行(因爲其中的next),並且此1將被視爲始終爲真的條件 - 非awk中的非零值爲true。

現在,如果省略了awk語句中的條件或操作,則使用默認值。默認的操作是不改變地打印行,並且這利用了它。它也同樣可以寫

1 { print } 

{ print } 

在後者的情況下,省略了條件和默認條件「真」被使用。1是這個的最短變體,因爲它的原因。

0

您需要第二個awk匹配下面的行。例如

cat test.fasta | awk -F _ '/^>/ { print $3"_"$4 } /^[A-Z]/ {print $1}' 

輸出:

Locus3443_allele1 
ATTCTACTACTACTCT 
Locus555662_allele2 
CTTCCCTACGATG 
Locus800_allele0 
TTCTACTTCATCT 

如果你不想_allele1位從awk腳本刪除"_"$4

1
$ awk -F_ '{print (/^>/ ? $3 : $0)}' file 
Locus3443 
ATTCTACTACTACTCT 
Locus555662 
CTTCCCTACGATG 
Locus800 
TTCTACTTCATCT 
+1

最''awkish' – 2015-02-24 15:07:08

0

你可以做每行一個正則表達式:

$ awk '{ sub(/^.*_L/,"L"); print $0}' /tmp/fasta.txt 
Locus3443_allele1 
ATTCTACTACTACTCT 
Locus555662_allele2 
CTTCCCTACGATG 
Locus800_allele0 
TTCTACTTCATCT 
相關問題