2017-01-12 67 views
-2

我不知道什么是从bash中的fasta文件中删除某些行的最佳方法。Bash:从fasta文件中删除行

在上面的例子中,假设我想删除它写入'GUITH'的行,那么如何删除这行和上面的行,直到找到其他'>'字符?

fasta文件:使用bash滤波之后

>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>O46898_GUITH 
RSLSKGPYIAAHLLKKLNNVDIQKPDVVIKTWSRSSTILPNMVGATIAVYNGKQHVPVYI 
SDQMVGHKLGEFSPTRTFRSH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

fasta文件:

>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

有问题的其他版本,但较硬的操纵。比方说,你有品种名称的文件:

species.txt

DROMO; 
PLAYO; 

而且要删除的文件FASTA行那里的物种不存在的species.txt文件内。因此,您可以得到与上述相同的输出,但您可以通过其他文件(不直接输入'GUITH')删除行。这样做的最好方法是什么?

+0

你试过什么? – 123

+0

我尝试用Python,它工作,但它没有优化。在bash中,我用'sed'尝试了一些东西,但找不到任何可行的东西。 – Natha

回答

1

在AWK:

$ awk '/^>/{p=1} /GUITH/{p=0} p' file 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

解释:

/^>/ { p=1 } # turn print flag up for each record starting with > 
/GUITH/ { p=0 } # turn print flag down for GUITH 
p    # print if p 

如果你想拥有批准的名单:

$ cat list 
DROMO 
PLAYO 
$ awk 'NR==FNR{a[$1];next} /^>/{n=split($0,b,"_"); p=(b[n] in a)} p' list file 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

解释:

NR==FNR { a[$1]; next }     # read the list to array a 
/^>/ { n=split($0,b,"_"); p=(b[n] in a) } # take the word after _ and if in a, enable print 
p           # if p, print 
+0

非常感谢,第一个解决方案效果非常好,并且有很好的解释!但是,从批准名称列表中尝试时出现此错误:'awk:非法字段$(),名称“i”'。你知道它可能来自哪里吗? – Natha

+0

是的,有一个错字,应该是:'NR == FNR {a [$ 1];下一个}',而不是'$ i'就像它最初一样。你用什么awk?在Mac上? –

1

要删除它是写“GUITH”行:

sed 's/>/\n&/' fasta.txt | sed '/_GUITH/,/^$/d' | sed '/^$/d' 

要删除的fasta文件中的行地方物种不存在species.txt:

随着GNU sed和庆典:

sed 's/>/\n&/' fasta.txt | sed -n -f <(sed 's/;$//;s|.*|/_&$/,/^$/p|' species.txt) | sed '/^$/d' 

输出:

 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH