接到一個(gè)非標(biāo)準(zhǔn)格式保存的fasta序列格式的文本,看起來像是直接從NCBI copy下來的佛纫。內(nèi)含多條序列缝彬,后續(xù)需要對(duì)序列進(jìn)行對(duì)位排列萌焰,而手工改不現(xiàn)實(shí)。有不想寫perl腳本谷浅,故尋求awk這一寶藏命令扒俯。
eg. 序列input.fa
>AF371111
1 atggatgccg acaagattgt attcaaagtc aataatcaag tggtttcctt gaagcccgag
61 atcattgtag accagtatga gtacaggtac ccgcgtatca aagacctgaa ggaacccagt
121 ataaccttag ggaaggctcc tgacctaaac aaagcataca agtctgtttt gtcgggcatg
181 aatgctgcca aacttgatcc agatgatgtg tgctcctatt tggcagctgc aatgcagttt
241 ttcgagggat cctgtcctga ggactggacc agctacggga tcctgattgc acgaaaagga
301 gacaagatca ctccagattc tcttgtggat ataaaacgta ctgatgtaga gggaagttgg
361 gccctgacag gaggaatgga gttaacgaga gaccccactg tttccgagca tgcatcttta
421 gtcggtcttc tcttgagtct gtatcggttg agcaaaatat cggggcaaaa cactggcaac
481 tacaagacaa acattgcaga taggatagag cagattttcg agacagcccc tttcgtcaag
>DQ281111
1 acagtcgaca atggatgccg acaagattgt gttcaaagtc aataatcagg tggtctcttt
61 gaagcctgag attatcgtgg atcaatatga gtacaagtac cctgccatca aggatttgaa
121 aaagccttgt atcaccctag ggaaagcccc cgacttgaac aaagcataca aatcagtttt
181 atcaggcatg aatgccgcca aacttgatcc ggatgatgta tgctcctact tggcagcagc
241 aatgcagttc tttgagggga catgtccgga agactggacc agctatggaa tcctgattgc
301 acgaaaagga gataggatca ccccaaactc tctagtggag ataaagcgta ctgatgtaga
361 agggaattgg gctctgacag gaggcatgga attgacaagg gaccccactg tctctgaaca
421 tgcatcttta gtcggtcttc tcctgagtct gtacaggttg agcaaaatat caggacagaa
481 cactggtaac tataagacaa acattgcaga taggatagag cagattttcg agacagcacc
541 ttttgttaag atcgtggaac accataccct aatgacaact cacaagatgt gtgctaattg
序列存在多個(gè)問題:
- 一條序列分很多行;
- 序列開頭用數(shù)字標(biāo)識(shí)一疯,且數(shù)字前是空格還是tab不明撼玄;
- 每行序列中,每10bp用空格分隔违施;
- 來源文件是非生信操作人員互纯,熟悉Windows瑟幕,故換行符很可能是\r\n磕蒲;
- 堿基是使用的小寫字母留潦,大寫字母為常態(tài)。
基于以上幾點(diǎn)的考慮辣往,一個(gè)功能一個(gè)功能的實(shí)現(xiàn):
awk '{if($0~/^>/) ID=$0 ; else seq[ID]=seq[ID]$0;}END{for (i in seq) {gsub(" ","",seq[i]);gsub("[0-9]","",seq[i]);print i"\n"toupper(seq[i])}}' 264_N_complete.txt
- 使用
vim -b 264_N_complete.txt
打開文件兔院,輸入:%s/^M//將\r換行符替換掉,^M為ctrl+v ctrl+m建的組合站削,不是直接鍵盤打出來的坊萝。
- 使用
-
{if($0~/^>/) ID=$0 ; else seq[ID]=seq[ID]$0;}
將多行序列轉(zhuǎn)換成單行,并將序列ID和Seq存如hash许起;
-
-
gsub(" ","",seq[i])
將空格替換成空十偶;
-
-
gsub("[0-9]","",seq[i])
將數(shù)字轉(zhuǎn)化為空
-
-
toupper(seq[i]
將小寫字母轉(zhuǎn)換成大寫字母
-
-
print i"\n"toupper(seq[i])
打印標(biāo)準(zhǔn)格式的fasta序列文件。序列后沒有加“\n”是因?yàn)樽詈笠恍?0是帶著\n的园细。若沒有的話就再加個(gè)“\n”惦积。
-
至此,序列轉(zhuǎn)化為:
>AF371111
ATGGATGCCGACAAGATTGTATTCAAAGTCAATAATCAAGTGGTTTCCTTGAAGCCCGAGATCATTGTAGACCAGTATGAGTACAGGTACCCGCGTATCAAAGACCTGAAGGAACCCAGTATAACCTTAGGGAAGGCTCCTGACCTAAACAAAGCATACAAGTCTGTTTTGTCGGGCATGAATGCTGCCAAACTTGATCCAGATGATGTGTGCTCCTATTTGGCAGCTGCAATGCAGTTTTTCGAGGGATCCTGTCCTGAGGACTGGACCAGCTACGGGATCCTGATTGCACGAAAAGGAGACAAGATCACTCCAGATTCTCTTGTGGATATAAAACGTACTGATGTAGAGGGAAGTTGGGCCCTGACAGGAGGAATGGAGTTAACGAGAGACCCCACTGTTTCCGAGCATGCATCTTTAGTCGGTCTTCTCTTGAGTCTGTATCGGT