Bash : 从 fasta 文件中删除行
Bash : remove lines from fasta file
我想知道从 bash 中的 fasta 文件中删除某些行的最佳方法是什么。
在上面的示例中,假设我要删除写有 'GUITH' 的行,如何删除这一行和上面的行,直到找到其他 '>'
字符?
fasta
文件:
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>O46898_GUITH
RSLSKGPYIAAHLLKKLNNVDIQKPDVVIKTWSRSSTILPNMVGATIAVYNGKQHVPVYI
SDQMVGHKLGEFSPTRTFRSH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
使用 bash: 过滤后的 fasta
文件
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
问题还有另一个版本,但更难操作。假设您有一个包含物种名称的文件:
species.txt
:
DROMO;
PLAYO;
并且您想删除 fasta 文件中 species.txt 文件中不存在物种的行。所以你得到了与上面相同的输出,但是你得到了要擦除的行,这要归功于一些其他文件(不是直接输入 'GUITH'
)。最好的方法是什么?
删除写'GUITH'的行:
sed 's/>/\n&/' fasta.txt | sed '/_GUITH/,/^$/d' | sed '/^$/d'
删除 fasta 文件中物种不存在的行 species.txt:
使用 GNU sed 和 bash:
sed 's/>/\n&/' fasta.txt | sed -n -f <( sed 's/;$//;s|.*|/_&$/,/^$/p|' species.txt ) | sed '/^$/d'
输出:
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
在 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[];next} /^>/{n=split([=12=],b,"_"); p=(b[n] in a)} p' list file
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
解释:
NR==FNR { a[]; next } # read the list to array a
/^>/ { n=split([=13=],b,"_"); p=(b[n] in a) } # take the word after _ and if in a, enable print
p # if p, print
我想知道从 bash 中的 fasta 文件中删除某些行的最佳方法是什么。
在上面的示例中,假设我要删除写有 'GUITH' 的行,如何删除这一行和上面的行,直到找到其他 '>'
字符?
fasta
文件:
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>O46898_GUITH
RSLSKGPYIAAHLLKKLNNVDIQKPDVVIKTWSRSSTILPNMVGATIAVYNGKQHVPVYI
SDQMVGHKLGEFSPTRTFRSH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
使用 bash: 过滤后的 fasta
文件
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
问题还有另一个版本,但更难操作。假设您有一个包含物种名称的文件:
species.txt
:
DROMO;
PLAYO;
并且您想删除 fasta 文件中 species.txt 文件中不存在物种的行。所以你得到了与上面相同的输出,但是你得到了要擦除的行,这要归功于一些其他文件(不是直接输入 'GUITH'
)。最好的方法是什么?
删除写'GUITH'的行:
sed 's/>/\n&/' fasta.txt | sed '/_GUITH/,/^$/d' | sed '/^$/d'
删除 fasta 文件中物种不存在的行 species.txt:
使用 GNU sed 和 bash:
sed 's/>/\n&/' fasta.txt | sed -n -f <( sed 's/;$//;s|.*|/_&$/,/^$/p|' species.txt ) | sed '/^$/d'
输出:
>B4KSI7_DROMO RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE VKPEMIGHYLGEFALTYKPVKH >Q7RT13_PLAYO RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE IKPEMIGYYLGEFSITYKHTRH
在 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[];next} /^>/{n=split([=12=],b,"_"); p=(b[n] in a)} p' list file
>B4KSI7_DROMO
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE
VKPEMIGHYLGEFALTYKPVKH
>Q7RT13_PLAYO
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE
IKPEMIGYYLGEFSITYKHTRH
解释:
NR==FNR { a[]; next } # read the list to array a
/^>/ { n=split([=13=],b,"_"); p=(b[n] in a) } # take the word after _ and if in a, enable print
p # if p, print