Удаление нескольких шаблонов из строк fasta

Мне нужно изменить этот шаблон

>UniRef90_Q57KY8 Total protein n=182 Tax=GammaproteobacteriaTaxID=1236 RepID=Q57KY8_SALCH MKKQLIRTLTASILLMSTSVLAQEAPSRTECIAPAKPGGGFDLTYKLIQVSLLETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPGEPGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKTLKDLMTAMEKDPNSVVIGAGASI GSQDWMKSALLAQKANVDPHKMRYVAFEGGGEPVTALMGNHVQVVSGDLSEMVPYLGGDKIRVLAVFSENRLPGQLANVP TAKEQGYDLVWPIIRGFYVGPKVSDADYQWWVDTFKKLQQTDEFKKQRDLRGLFEFDMTGQQLDDYVKKQVTDYREQAKAFGLAK >UniRef90_G8LKQ2 UPF5341 protein yflP n=80 Tax=Bacteria TaxID=2 RepID=G8LKQ2_ENTCL MKKQLLSTLAASVLMISASVVQAQDAPSRTECIAPAKPGGGFDLTCKLIQVSMLETGAIAKPMRVTYMPGGVGAVAYNAI VAQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLATVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGAS IGSQDWMKAALLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLNGDKIRVLAVFSENRLPGQLANV PTAKEQGYDLVWPIIRGFFVGPKVTDAEYQWWVETFNKLQQTEAFKKQRDLRGLFEFNLSGKPLDEYVKKQVNDYREQAKAFGLAK >UniRef90_E3GB58 Uncharacterized protein n=1 Tax=Enterobacter lignolyticus (strain SCF1) TaxID=701347 RepID=E3GB58_ENTLS MKKTLLQTVIATALLMSTAAFAVEAPGRTECIAPAKPGGGFDLTCKLIQVSLQETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGASI GSQDWMKAAKLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLQGDKIRVLAVFAENRLPGQLANVP TAKEQGYDLVWPIIRGFYLGPKVSDDEYNWWVETFQKLQQTDEFKKQRELRGLFEFNMNGKALDEYVKKQVTDYREQAKSFGLAK

На что-то вроде

>Q57KY8_Gammaproteobacteria MKKQLIRTLTASILLMSTSVLAQEAPSRTECIAPAKPGGGFDLTYKLIQVSLLETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPGEPGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKTLKDLMTAMEKDPNSVVIGAGASI GSQDWMKSALLAQKANVDPHKMRYVAFEGGGEPVTALMGNHVQVVSGDLSEMVPYLGGDKIRVLAVFSENRLPGQLANVP TAKEQGYDLVWPIIRGFYVGPKVSDADYQWWVDTFKKLQQTDEFKKQRDLRGLFEFDMTGQQLDDYVKKQVTDYREQAKAFGLAK >G8LKQ2_Bacteria MKKQLLSTLAASVLMISASVVQAQDAPSRTECIAPAKPGGGFDLTCKLIQVSMLETGAIAKPMRVTYMPGGVGAVAYNAI VAQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLATVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGAS IGSQDWMKAALLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLNGDKIRVLAVFSENRLPGQLANV PTAKEQGYDLVWPIIRGFFVGPKVTDAEYQWWVETFNKLQQTEAFKKQRDLRGLFEFNLSGKPLDEYVKKQVNDYREQAKAFGLAK >E3GB58_Enterobacter lignolyticus (strain SCF1) MKKTLLQTVIATALLMSTAAFAVEAPGRTECIAPAKPGGGFDLTCKLIQVSLQETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGASI GSQDWMKAAKLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLQGDKIRVLAVFAENRLPGQLANVP TAKEQGYDLVWPIIRGFYLGPKVSDDEYNWWVETFQKLQQTDEFKKQRELRGLFEFNMNGKALDEYVKKQVTDYREQAKSFGLAK

Итак, избавляясь от имени базы данных в начале, оставляя код впоследствии, следуя под знаком подчеркивания с названием налога.

2
задан 5 September 2017 в 12:13

6 ответов

Вы можете использовать:

$ sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/' file
>Q57KY8_Gammaproteobacteria
MKKQLIRTLTASILLMSTSVLAQEAPSRTECIAPAKPGGGFDLTYKLIQVSLLETGAIEKPMRVTYMPGGVGAVAYNAIV
AQRPGEPGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKTLKDLMTAMEKDPNSVVIGAGASI
GSQDWMKSALLAQKANVDPHKMRYVAFEGGGEPVTALMGNHVQVVSGDLSEMVPYLGGDKIRVLAVFSENRLPGQLANVP
TAKEQGYDLVWPIIRGFYVGPKVSDADYQWWVDTFKKLQQTDEFKKQRDLRGLFEFDMTGQQLDDYVKKQVTDYREQAKAFGLAK
>G8LKQ2_Bacteria 
MKKQLLSTLAASVLMISASVVQAQDAPSRTECIAPAKPGGGFDLTCKLIQVSMLETGAIAKPMRVTYMPGGVGAVAYNAI
VAQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLATVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGAS
IGSQDWMKAALLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLNGDKIRVLAVFSENRLPGQLANV
PTAKEQGYDLVWPIIRGFFVGPKVTDAEYQWWVETFNKLQQTEAFKKQRDLRGLFEFNLSGKPLDEYVKKQVNDYREQAKAFGLAK
>E3GB58_Enterobacter lignolyticus (strain SCF1) 
MKKTLLQTVIATALLMSTAAFAVEAPGRTECIAPAKPGGGFDLTCKLIQVSLQETGAIEKPMRVTYMPGGVGAVAYNAIV
AQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGASI
GSQDWMKAAKLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLQGDKIRVLAVFAENRLPGQLANVP
TAKEQGYDLVWPIIRGFYLGPKVSDDEYNWWVETFQKLQQTDEFKKQRELRGLFEFNMNGKALDEYVKKQVTDYREQAKSFGLAK

Это зависит от первого фрагмента текста, который вы хотите быть первым фрагментом текста после первого подчеркивания (_). Там могут быть остатки пробелов, оставшиеся на выходе после названия налога - ваш файл, по-видимому, несовместим с тем, существует ли пространство перед TaxID, поэтому трудно сделать это чистым. Мы можем удалить их, если это важно, с дополнительной командой s до конца - s/(.*)\s+/\1, выполняя полную команду:

sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/;s/(.*)\s+/\1/' file

Примечания

-r используют ERE /^>/ найдите строки, начинающиеся с > s/old/new/ в этих строках, замените old на new [^_]+ некоторыми символами, которые не являются _ (some chars) сохраняют some chars, чтобы позже ссылаться на \1 [ f17] и т. д. .* любое число любых символов ; разделяет команды, например, в оболочке \s+ один или несколько символов горизонтального пробела
1
ответ дан 22 May 2018 в 18:48

Вы можете использовать:

$ sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/' file >Q57KY8_Gammaproteobacteria MKKQLIRTLTASILLMSTSVLAQEAPSRTECIAPAKPGGGFDLTYKLIQVSLLETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPGEPGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKTLKDLMTAMEKDPNSVVIGAGASI GSQDWMKSALLAQKANVDPHKMRYVAFEGGGEPVTALMGNHVQVVSGDLSEMVPYLGGDKIRVLAVFSENRLPGQLANVP TAKEQGYDLVWPIIRGFYVGPKVSDADYQWWVDTFKKLQQTDEFKKQRDLRGLFEFDMTGQQLDDYVKKQVTDYREQAKAFGLAK >G8LKQ2_Bacteria MKKQLLSTLAASVLMISASVVQAQDAPSRTECIAPAKPGGGFDLTCKLIQVSMLETGAIAKPMRVTYMPGGVGAVAYNAI VAQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLATVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGAS IGSQDWMKAALLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLNGDKIRVLAVFSENRLPGQLANV PTAKEQGYDLVWPIIRGFFVGPKVTDAEYQWWVETFNKLQQTEAFKKQRDLRGLFEFNLSGKPLDEYVKKQVNDYREQAKAFGLAK >E3GB58_Enterobacter lignolyticus (strain SCF1) MKKTLLQTVIATALLMSTAAFAVEAPGRTECIAPAKPGGGFDLTCKLIQVSLQETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGASI GSQDWMKAAKLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLQGDKIRVLAVFAENRLPGQLANVP TAKEQGYDLVWPIIRGFYLGPKVSDDEYNWWVETFQKLQQTDEFKKQRELRGLFEFNMNGKALDEYVKKQVTDYREQAKSFGLAK

Это зависит от первого фрагмента текста, который вы хотите быть первым фрагментом текста после первого подчеркивания (_). Там могут быть остатки пробелов, оставшиеся на выходе после названия налога - ваш файл, по-видимому, несовместим с тем, существует ли пространство перед TaxID, поэтому трудно сделать это чистым. Мы можем удалить их, если это важно, с дополнительной командой s до конца - s/(.*)\s+/\1, выполняя полную команду:

sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/;s/(.*)\s+/\1/' file

Примечания

-r используют ERE /^>/ найдите строки, начинающиеся с > s/old/new/ в этих строках, замените old на new [^_]+ некоторыми символами, которые не являются _ (some chars) сохраняют some chars, чтобы позже ссылаться на \1 \2 и т. д. .* любое число любых символов ; разделяет команды, например, в оболочке \s+ один или несколько символов горизонтального пробела
1
ответ дан 18 July 2018 в 07:27

Вы можете использовать:

$ sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/' file >Q57KY8_Gammaproteobacteria MKKQLIRTLTASILLMSTSVLAQEAPSRTECIAPAKPGGGFDLTYKLIQVSLLETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPGEPGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKTLKDLMTAMEKDPNSVVIGAGASI GSQDWMKSALLAQKANVDPHKMRYVAFEGGGEPVTALMGNHVQVVSGDLSEMVPYLGGDKIRVLAVFSENRLPGQLANVP TAKEQGYDLVWPIIRGFYVGPKVSDADYQWWVDTFKKLQQTDEFKKQRDLRGLFEFDMTGQQLDDYVKKQVTDYREQAKAFGLAK >G8LKQ2_Bacteria MKKQLLSTLAASVLMISASVVQAQDAPSRTECIAPAKPGGGFDLTCKLIQVSMLETGAIAKPMRVTYMPGGVGAVAYNAI VAQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLATVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGAS IGSQDWMKAALLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLNGDKIRVLAVFSENRLPGQLANV PTAKEQGYDLVWPIIRGFFVGPKVTDAEYQWWVETFNKLQQTEAFKKQRDLRGLFEFNLSGKPLDEYVKKQVNDYREQAKAFGLAK >E3GB58_Enterobacter lignolyticus (strain SCF1) MKKTLLQTVIATALLMSTAAFAVEAPGRTECIAPAKPGGGFDLTCKLIQVSLQETGAIEKPMRVTYMPGGVGAVAYNAIV AQRPAEAGTVVAFSGGSLLNLSQGKFGRYGVDDVRWLASVGTDYGMIAVRADSPWKSLKDLLTAMEKDPNSVVIGAGASI GSQDWMKAAKLAQQAKVDPHKMRYVAFEGGGEPVTALMGNHVQAVSGDLSEMVPYLQGDKIRVLAVFAENRLPGQLANVP TAKEQGYDLVWPIIRGFYLGPKVSDDEYNWWVETFQKLQQTDEFKKQRELRGLFEFNMNGKALDEYVKKQVTDYREQAKSFGLAK

Это зависит от первого фрагмента текста, который вы хотите быть первым фрагментом текста после первого подчеркивания (_). Там могут быть остатки пробелов, оставшиеся на выходе после названия налога - ваш файл, по-видимому, несовместим с тем, существует ли пространство перед TaxID, поэтому трудно сделать это чистым. Мы можем удалить их, если это важно, с дополнительной командой s до конца - s/(.*)\s+/\1, выполняя полную команду:

sed -r '/^>/ s/^>[^_]+_([^ ]+) .* Tax=(.*)TaxID=.*/>\1_\2/;s/(.*)\s+/\1/' file

Примечания

-r используют ERE /^>/ найдите строки, начинающиеся с > s/old/new/ в этих строках, замените old на new [^_]+ некоторыми символами, которые не являются _ (some chars) сохраняют some chars, чтобы позже ссылаться на \1 \2 и т. д. .* любое число любых символов ; разделяет команды, например, в оболочке \s+ один или несколько символов горизонтального пробела
1
ответ дан 24 July 2018 в 18:48

Вы можете использовать следующий однострочный perl:

perl -ne 'if($_=~/^>/){($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; print ">",$id,"_",$tax,"\n";}else{print $_;}' input.fa > output.fa

Это будет читаться с input.fa, изменить заголовки fasta и записать в output.fa

Объяснение команды:

perl -ne '                                          #call perl and read the file line-wise
  if($_=~/^>/){                                     #check if the line is a header
    ($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; #extract the ID and the tax string
    print ">",$id,"_",$tax,"\n";}                   #print the new header 
  else{                                             #print the sequence (not a header line)
    print $_;}
' input.fa > output.fa
2
ответ дан 22 May 2018 в 18:48

Вы можете использовать следующий однострочный perl:

perl -ne 'if($_=~/^>/){($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; print ">",$id,"_",$tax,"\n";}else{print $_;}' input.fa > output.fa

Это будет читаться с input.fa, изменить заголовки fasta и записать в output.fa

Объяснение команды:

perl -ne ' #call perl and read the file line-wise if($_=~/^>/){ #check if the line is a header ($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; #extract the ID and the tax string print ">",$id,"_",$tax,"\n";} #print the new header else{ #print the sequence (not a header line) print $_;} ' input.fa > output.fa
2
ответ дан 18 July 2018 в 07:27

Вы можете использовать следующий однострочный perl:

perl -ne 'if($_=~/^>/){($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; print ">",$id,"_",$tax,"\n";}else{print $_;}' input.fa > output.fa

Это будет читаться с input.fa, изменить заголовки fasta и записать в output.fa

Объяснение команды:

perl -ne ' #call perl and read the file line-wise if($_=~/^>/){ #check if the line is a header ($id,$tax)=$_=~/UniRef90_(\S+).*Tax=(.*)TaxID/; #extract the ID and the tax string print ">",$id,"_",$tax,"\n";} #print the new header else{ #print the sequence (not a header line) print $_;} ' input.fa > output.fa
2
ответ дан 24 July 2018 в 18:48

Другие вопросы по тегам:

Похожие вопросы: