2

I need to change this pattern

>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

To something like

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

So, getting rid of the database name at the beginning, leaving the code afterwards, followed by an underscore with the name of the Tax.

2 Answers 2

2

You can use the following perl one-liner:

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

This will read from input.fa, modify the fasta headers and write to output.fa


Explanation of the command:

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
1

You might use:

$ 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

This relies on the first piece of text you want being the first piece of text after the first underscore (_). There might be trailing spaces remaining in the output after the Tax name - your file seems to be inconsistent about whether there is a space before TaxID so it's hard to make this clean. We can remove them if it's important with an extra s command to the end -- s/(.*)\s+/\1 making the complete command:

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

Notes

  • -r use ERE
  • /^>/ find lines starting with >
  • s/old/new/ on those lines replace old with new
  • [^_]+ some characters that are not _
  • (some chars) save some chars to reference later with \1 \2 etc
  • .* any number of any characters
  • ; separates commands, like in the shell
  • \s+ one or more horizontal whitespace characters

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .