Bash 使用特定符号之间匹配的ID字符串筛选多个fasta文件

Bash 使用特定符号之间匹配的ID字符串筛选多个fasta文件,bash,bioinformatics,biopython,fasta,Bash,Bioinformatics,Biopython,Fasta,我被这个问题困扰了一段时间,虽然我发现了一系列类似的问题,但没有一个完全符合我的问题或解决了这个问题。这就是交易: 我有一个输入。fasta,格式如下: >sp|O42363|APOA1_DANRE Apolipoprotein A-I OS=Danio rerio OX=7955 GN=apoa1 PE=2 SV=1 MKFVALALTLLLALGSQANLFQADAPTQLEHYKAAALVYLNQVKDQAEKALDNLDGTDYEQYKLQLSESLTKLQEYAQTTSQALTP

我被这个问题困扰了一段时间,虽然我发现了一系列类似的问题,但没有一个完全符合我的问题或解决了这个问题。这就是交易:

我有一个
输入。fasta
,格式如下:

>sp|O42363|APOA1_DANRE Apolipoprotein A-I OS=Danio rerio OX=7955 GN=apoa1 PE=2 SV=1
MKFVALALTLLLALGSQANLFQADAPTQLEHYKAAALVYLNQVKDQAEKALDNLDGTDYEQYKLQLSESLTKLQEYAQTTSQALTPYAETISTQLMENTKQLRERVMTDVEDLRSKLEPHRAELYTALQKHIDEYREKLEPVFQEYSALNRQNAEQLRAKLEPLMDDIRKAFESNIEETKSKVVPMVEAVRTKLTERLEDLRTMAAPYAEEYKEQLVKAVEEAREKIAPHTQDLQTRMEPYMENVRTTFAQMYETIAKAIQA
>sp|Q90260|ASL1B_DANRE Achaete-scute homolog 1b OS=Danio rerio OX=7955 GN=ascl1b PE=2 SV=1
MEATVVATTQLTQDSFYQPFSESLEKQDRECKVLKRQRSSSPELLRCKRRLTFNGLGYTIPQQQPMAVARRNERERNRVKQVNMGFQTLRQHVPNGAANKKMSKVETLRSAVEYIRALQQLLDEHDAVSAVLQCGVPSPSVSNAYSAGPESPHSAYSSDEGSYEHLSSEEQELLDFTTWFDRYESGASMATKDWC
>sp|Q6TH01|C10_DANRE Protein C10 OS=Danio rerio OX=7955 GN=si:dkey-29f10.1 PE=2 SV=1
MASAPAQQPTLTVEQARVVLSEVIQAFSVPENAARMEEARESACNDMGKMLQLVLPVATQIQQEVIKAYGFNNEGEGVLKFARLVKMYETQDPEIAAMSVKLKSLLLPPLSTPPIGSGIPTS
>sp|Q6PFL6|CCD43_DANRE Coiled-coil domain-containing protein 43 OS=Danio rerio OX=7955 GN=ccdc43 PE=2 SV=1
MAAPEQIAGEFENWLNERLDSLEVDREVYGAYILGVLQEEESDEEQKDALQGILSAFLEEETLEEVCQEILKQWTECCSRSGAKSNQADAEVQAIASLIEKQAQIVVKQKEVSEDAKKRKEAVLAQYANVTDDEDEAEEEEQVPVGIPSDKSLFKNTNVEDVLNRRKLQRDQAKEDAQKKKEQDKMQREKDKLSKQERKDKEKKRTQKGERKR
>sp|P0C7U5|C5AR1_DANRE C5a anaphylatoxin chemotactic receptor 1 OS=Danio rerio OX=7955 GN=c5ar1 PE=3 SV=1
MDDNNSDWTSYDFGNDTIPSPNEISLSHIGTRHWITLVCYGIVFLLGVPGNALVVWVTGFRMPNSVNAQWFLNLAIADLLCCLSLPILMVPLAQDQHWPFGALACKLFSGIFYMMMYCSVLLLVVISLDRFLLVTKPVWCQNNRQPRQARILCFIIWILGLLGSSPYFAHMEIQHHSETKTVCTGSYSSLGHAWAITIIRSFLFFLLPFLIICISHWKVYHMTSSGRRQRDKSSRTLRVILALVLGFFLCWTPLH
BEGIN {
    FS="[|]"
}

# NR  is the overall record (line) number
# FNR is the record (line) number in the current input file

NR==FNR {   # True as long as we are reading the first input file
    ids[$0]   # Create a key in ids for every id from ids.txt
    next      # Don't process further actions
}

# Because of the 'next' statement above, we'll reach this point only
# when reading the second input file (input.fasta)
$2 in ids  {
    # set or reset a variable p to 2 if the second field
    # was found in the ids lookup
    p = 2
}

# Decrement the variable p on every iteration and check if it
# is greater than 0 after that. If that's true, awk will print 
# the current line
p--> 0
ids.txt
列表,格式如下:

Q90260
Q6PFL6
我想提取所有fasta序列及其标头,其中
IDs.txt的ID是标头的元素。
我已经尝试了
grep-w-a2-ffid\u list.txt input.fasta--没有组分隔符>out.fasta,但是没有成功

理想情况下,我希望通过正则表达式检查以sp开头的每一行的两个
之间的字符串是否与我的
idx.txt
中的任何ID匹配。如果是这样,则将该头和fasta存储在
out.fasta

因此,
out.fasta
看起来是这样的:

>sp|Q90260|ASL1B_DANRE Achaete-scute homolog 1b OS=Danio rerio OX=7955 GN=ascl1b PE=2 SV=1
MEATVVATTQLTQDSFYQPFSESLEKQDRECKVLKRQRSSSPELLRCKRRLTFNGLGYTIPQQQPMAVARRNERERNRVKQVNMGFQTLRQHVPNGAANKKMSKVETLRSAVEYIRALQQLLDEHDAVSAVLQCGVPSPSVSNAYSAGPESPHSAYSSDEGSYEHLSSEEQELLDFTTWFDRYESGASMATKDWC
>sp|Q6PFL6|CCD43_DANRE Coiled-coil domain-containing protein 43 OS=Danio rerio OX=7955 GN=ccdc43 PE=2 SV=1
MAAPEQIAGEFENWLNERLDSLEVDREVYGAYILGVLQEEESDEEQKDALQGILSAFLEEETLEEVCQEILKQWTECCSRSGAKSNQADAEVQAIASLIEKQAQIVVKQKEVSEDAKKRKEAVLAQYANVTDDEDEAEEEEQVPVGIPSDKSLFKNTNVEDVLNRRKLQRDQAKEDAQKKKEQDKMQREKDKLSKQERKDKEKKRTQKGERKR
我很确定这可以通过
awk
grep
来表达,但我对bash还不熟悉,所以我现在很艰难


提前多谢!:)

使用
join
sort

join -t \| -2 2 -o 2.1,2.2,2.3 <(sort ids.txt) <(sort -t \| -k2 input.fasta)
将-t\|-22-o2.1,2.2,2.3与
awk

awk -F'[|]' 'NR==FNR{ids[$0];next}$2 in ids' ids.txt input.fasta
说明:

>sp|Q90260|ASL1B_DANRE Achaete-scute homolog 1b OS=Danio rerio OX=7955 GN=ascl1b PE=2 SV=1
>sp|Q6PFL6|CCD43_DANRE Coiled-coil domain-containing protein 43 OS=Danio rerio OX=7955 GN=ccdc43 PE=2 SV=1
我将文件ids.txt和input.fasta作为输入文件传递给awk。订单很重要
-F'[|]'
将输入字段分隔符设置为

剧本:

# NR  is the overall record (line) number
# FNR is the record (line) number in the current input file

NR==FNR {   # True as long as we are reading the first input file
    ids[$0]   # Create a key in ids for every id from ids.txt
    next      # Don't process further actions
}

# Because of the 'next' statement above, we'll reach this point only
# when reading the second input file (input.fasta)
$2 in ids   # Print the current line if the second field
            # was found in the ids lookup
输出:

>sp|Q90260|ASL1B_DANRE Achaete-scute homolog 1b OS=Danio rerio OX=7955 GN=ascl1b PE=2 SV=1
>sp|Q6PFL6|CCD43_DANRE Coiled-coil domain-containing protein 43 OS=Danio rerio OX=7955 GN=ccdc43 PE=2 SV=1

更新:原来你还想打印下面的匹配。这可以通过以下方式实现:

>sp|O42363|APOA1_DANRE Apolipoprotein A-I OS=Danio rerio OX=7955 GN=apoa1 PE=2 SV=1
MKFVALALTLLLALGSQANLFQADAPTQLEHYKAAALVYLNQVKDQAEKALDNLDGTDYEQYKLQLSESLTKLQEYAQTTSQALTPYAETISTQLMENTKQLRERVMTDVEDLRSKLEPHRAELYTALQKHIDEYREKLEPVFQEYSALNRQNAEQLRAKLEPLMDDIRKAFESNIEETKSKVVPMVEAVRTKLTERLEDLRTMAAPYAEEYKEQLVKAVEEAREKIAPHTQDLQTRMEPYMENVRTTFAQMYETIAKAIQA
>sp|Q90260|ASL1B_DANRE Achaete-scute homolog 1b OS=Danio rerio OX=7955 GN=ascl1b PE=2 SV=1
MEATVVATTQLTQDSFYQPFSESLEKQDRECKVLKRQRSSSPELLRCKRRLTFNGLGYTIPQQQPMAVARRNERERNRVKQVNMGFQTLRQHVPNGAANKKMSKVETLRSAVEYIRALQQLLDEHDAVSAVLQCGVPSPSVSNAYSAGPESPHSAYSSDEGSYEHLSSEEQELLDFTTWFDRYESGASMATKDWC
>sp|Q6TH01|C10_DANRE Protein C10 OS=Danio rerio OX=7955 GN=si:dkey-29f10.1 PE=2 SV=1
MASAPAQQPTLTVEQARVVLSEVIQAFSVPENAARMEEARESACNDMGKMLQLVLPVATQIQQEVIKAYGFNNEGEGVLKFARLVKMYETQDPEIAAMSVKLKSLLLPPLSTPPIGSGIPTS
>sp|Q6PFL6|CCD43_DANRE Coiled-coil domain-containing protein 43 OS=Danio rerio OX=7955 GN=ccdc43 PE=2 SV=1
MAAPEQIAGEFENWLNERLDSLEVDREVYGAYILGVLQEEESDEEQKDALQGILSAFLEEETLEEVCQEILKQWTECCSRSGAKSNQADAEVQAIASLIEKQAQIVVKQKEVSEDAKKRKEAVLAQYANVTDDEDEAEEEEQVPVGIPSDKSLFKNTNVEDVLNRRKLQRDQAKEDAQKKKEQDKMQREKDKLSKQERKDKEKKRTQKGERKR
>sp|P0C7U5|C5AR1_DANRE C5a anaphylatoxin chemotactic receptor 1 OS=Danio rerio OX=7955 GN=c5ar1 PE=3 SV=1
MDDNNSDWTSYDFGNDTIPSPNEISLSHIGTRHWITLVCYGIVFLLGVPGNALVVWVTGFRMPNSVNAQWFLNLAIADLLCCLSLPILMVPLAQDQHWPFGALACKLFSGIFYMMMYCSVLLLVVISLDRFLLVTKPVWCQNNRQPRQARILCFIIWILGLLGSSPYFAHMEIQHHSETKTVCTGSYSSLGHAWAITIIRSFLFFLLPFLIICISHWKVYHMTSSGRRQRDKSSRTLRVILALVLGFFLCWTPLH
BEGIN {
    FS="[|]"
}

# NR  is the overall record (line) number
# FNR is the record (line) number in the current input file

NR==FNR {   # True as long as we are reading the first input file
    ids[$0]   # Create a key in ids for every id from ids.txt
    next      # Don't process further actions
}

# Because of the 'next' statement above, we'll reach this point only
# when reading the second input file (input.fasta)
$2 in ids  {
    # set or reset a variable p to 2 if the second field
    # was found in the ids lookup
    p = 2
}

# Decrement the variable p on every iteration and check if it
# is greater than 0 after that. If that's true, awk will print 
# the current line
p--> 0

请将该示例输入的所需输出(无说明)添加到您的问题中(无评论)。谢谢快速回复。输出非常接近我所需要的,但它仍然错过了fasta序列(标题下的行)。我尝试了一些不太具体的东西,现在似乎可以使用了:
grep-A1-F-F ids.txt input.fasta | sed'/-$/d'>out.fasta
在运行该行之前,我使用
dos2unix
转换了
ids.txt
。在那之后,它确实起了作用。我假设
ids.txt
可能是在windows系统上生成的,与unix不兼容。嘿,对不起,我不理解这个要求。下面的awk命令也将打印标题下的行:
awk-F'[|]''NR==FNR{ids[$0];ids{p=2}p>0中的next}$2;{p--}'ids.txt input.fasta
(稍后将添加到我的答案中)非常有效:)非常感谢。不客气。更新了答案并添加了解释