2017-04-27 113 views
1

我在文件夾中有幾千個文件。每個文件的內容如下所示。我在這個例子中的文件名是:AAB08704.1.fasta將文件中的多行合併到單行文件中跳過標題

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE 
    VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI 
    PARIH 

我想跳過第一行,然後將餘下線合併成一條線。我所有的文件都以「>」開頭,這是標題信息,以下幾行是我想合併成一行的序列信息。

我試圖

sed -i '2,$s/\n//g' AAB08704.1.fasta 

我甚至嘗試多FASTA轉換爲單行FASTA使用:

awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);} END {printf("\n");}' < AAB08704.1.fasta 

這兩個命令沒有做什麼,我的期望。任何線索?

預期輸出:

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 

貓-A AAB08704.1.fasta給出了這樣的:

M-oM-;M-?>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]^M$ 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE^M$ 
    VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI^M$ 
+0

現在又增加了我的預期輸出。 – biobudhan

回答

1

隨着perl

$ perl -pe 's/\n// if $. > 1 && !eof' AAB08704.1.fasta 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
  • s/\n//刪除換行符
    • if $. > 1 && !eof只有當行號文件
  • 使用perl -i -pe大於一個,而不是結束對就地編輯。見Command Switches的文檔上-i-p-e
+0

可悲的是,它並沒有取代新的一行字符。我仍然得到與我的輸入文件相同的輸出。看起來像我的文件有一個格式問題。任何導致強制替代? – biobudhan

+0

你能粘貼'cat -A AAB08704.1.fasta'的輸出嗎?我認爲你的文件可能有'\ r \ n'而不是'\ n'作爲結尾 – Sundeep

+0

是的,現在添加。 – biobudhan

0

喜歡這個?用於GNU AWK:

$ awk '{p=p $0 (FNR==1?ORS:"")}ENDFILE{print p;p=""}' file file 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 

這一個>之前移除所述第一記錄中的所有字符:

$ awk 'FNR==1{sub(/^[^>]*/,"");p=$0 ORS;next}{p=p $0}ENDFILE{print p;p=""}' file file 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
+0

我現在更新了我的預期輸出 – biobudhan

+0

沒有錯別字,只用一個模擬多個文件。 –

+1

@Sundeep它有意地打印兩次'file',因爲在awk代碼之後兩次提到'file'。OP開始於:_I有數千個文件_,我認爲@biobudhan不想在當時處理一個文件,因此我的解決方案會處理所有作爲參數給出的文件。但是,輸出沒有要求(每個輸出分開文件等),因此它將所有內容輸出到stdout。如果你測試其他解決方案的問題,他們很可能會失敗,如果給予更多的文件一次處理,所以他們需要在一個shell循環內運行。 –

0

sed的是面向行的,所以需要在緩衝液中加載線比除去\n

sed -i -e '1d' -e 'H;${x;s/\n//g}' AAB08704.1.fasta 

awk可能適應行爲

awk 'BEGIN{FS="\n";RS="()";OFS=""}{$1="";$0=$0 ""}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta 

# or 
awk '!a++{next}{printf("%s", $0) > (FILENAME ".tmp")}' AAB08704.1.fasta && mv AAB08704.1.fasta.tmp AAB08704.1.fasta 
# or 
awk 'NR>1{printf("%s",$0)}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta 
+0

我現在更新了我的預期輸出 – biobudhan

+0

awk方法只是刪除我的文件的內容。 – biobudhan

+0

對不起awk,我只是混合使用2版本的代碼(RS在第二版中使用)。改編 – NeronLeVelu

0

這也適用於:

awk 'BEGIN{ ORS = "" }/^>/{ print $0, "\n"}NR>1{ print $0 }' file 

輸出:

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
相關問題