How to append two fasta files?


Login or Register to Reply

 
Thread Tools Search this Thread
# 1  
How to append two files?

I have two fasta files as shown below,
Code:
File:1
>Contig_1:90600-91187 
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGAACAGGAATTGATGACGGTC
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG               
>Contig_24:26615-28387
GCTGCGGCGCTGATCCTGGCGGCCCGCGCCGAGGAGATCGCCCGTTTGGAGCGCGGCGAA

Code:
File2
>Contig_1:90600-91187
GACCGTCATCAATTCCTGTTCCTTGCCCTTGACGACCTCATCCACGTCCTTGATGGCCTT 
>Contig_24:26615-28387
TTCGCCGCGCTCCAAACGGGCGATCTCCTCGGCGCGGGCCGCCAGGATCAGCGCCG

Both files are having the same fasta headers but vary in terms of sequences. Hence, I need to replace File:2 sequences in File:1 as shown below,
Code:
Expected outcome:
>Contig_1:90600-91187
GACCGTCATCAATTCCTGTTCCTTGCCCTTGACGACCTCATCCACGTCCTTGATGGCCTT 
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG
>Contig_24:26615-28387
TTCGCCGCGCTCCAAACGGGCGATCTCCTCGGCGCGGGCCGCCAGGATCAGCGCCG

I tried with
Code:
cat

command, but it is concatenating all the sequences instead of replacing the sequences as I mentioned above.
Please help me to do the same.
Thank you in advance.

Last edited by dineshkumarsrk; 4 Days Ago at 01:36 AM.. Reason: correction
# 2  
not sure if I follow your samples and the desired output, but I think you might want this.

awk -f dinesh.awk file2 file1 where dinesh.awk is:
Code:
FNR==NR {
  if (FNR%2)
     head=$0
  else
     f2[head]=$0
  next
}
{
  if (FNR%2) {
     head=$0
     print
  }
  else
     print (head in f2)? f2[head] : $0
}

results in:
Code:
>Contig_1:90600-91187
GACCGTCATCAATTCCTGTTCCTTGCCCTTGACGACCTCATCCACGTCCTTGATGGCCTT
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG
>Contig_24:26615-28387
TTCGCCGCGCTCCAAACGGGCGATCTCCTCGGCGCGGGCCGCCAGGATCAGCGCCG


Last edited by vgersh99; 5 Days Ago at 01:37 PM..
These 3 Users Gave Thanks to vgersh99 For This Post:
# 3  
combine and upgrade by the second fasta file

I put my answer back as I met the scenarios:
1) when file2.fasta contains more entries than in file1.fasta and vice versa. and
2) when the sequence part can have more than one row;
Code:
awk 'BEGIN{RS=">";FS="\n"} {A[$1]=$2} END{for (i in A) {if (i) print ">"i,FS,A[i]}}' file1.fasta file2.fasta

This only works for 2-line fasta sequence files (i.e. each entry has two lines, One starts with ">" as the header, the other is the DNA sequence. @vgersh99, could you please elaborate your code for scenario 2)? Thanks!
Code:
file1.fasta
>Contig_1:90600-91187
GACCGTCATCAATTCCTGTTCCTTGCCCTTGACGACCTCATCCACGTCCTTGATGGCCTT 
>Contig_24:26615-28387
TTCGCCGCGCTCCAAACGGGCGATCTCCTCGGCGCGGGCCGCCAGGATCAGCGCCG
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG               
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGA

file2.fasta:
>Contig_1:90600-91187 
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGAACAGGAATTGATGACGGTC
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGAACAGG
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGA
>Contig_24:26615-28387
GCTGCGGCGCTGATCCTGGCGGCCCGCGCCGAGGAGATCGCCCGTTTGGAGCGCGGCGAA

output:
>Contig_1:90600-91187 
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGAACAGGAATTGATGACGGTC
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGAACAGG
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGA
>Contig_24:26615-28387
GCTGCGGCGCTGATCCTGGCGGCCCGCGCCGAGGAGATCGCCCGTTTGGAGCGCGGCGAA
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG               
AAGGCCATCAAGGACGTGGATGAGGTCGTCAAGGGCAAGGA

This User Gave Thanks to yifangt For This Post:
# 4  
Quote:
Originally Posted by yifangt
I put my answer back as I met the scenarios:
1) when file2.fasta contains more entries than in file1.fasta and vice versa. and
2) when the sequence part can have more than one row;
Code:
awk 'BEGIN{RS=">";FS="\n"} {A[$1]=$2} END{for (i in A) {if (i) print ">"i,FS,A[i]}}' file1.fasta file2.fasta

This only works for 2-line fasta sequence files (i.e. each entry has two lines, One starts with ">" as the header, the other is the DNA sequence. @vgersh99, could you please elaborate your code for scenario 2)? Thanks!
My previously posted attempt was for the provided sample files ONLY - 2 lines for each sequence: 1 header and 1 "data" lines.
Had the OP elaborated on the possible other sample data files, an alternate solution would have been provided.
This User Gave Thanks to vgersh99 For This Post:
# 5  
May I paraphrase your request: You want file2's sequences to prevail and file1's sequences inserted only if there's no equivalent in file2. If so, try
Code:
tr $'\n>' $' \n' <file1|  grep -vf <(sed -n 's/>//p' file2) | cat  <(tr $'\n>' $' \n' <file2) - |  tr  -s $' \n' $'\n>'
>Contig_1:90600-91187
GACCGTCATCAATTCCTGTTCCTTGCCCTTGACGACCTCATCCACGTCCTTGATGGCCTT
>Contig_24:26615-28387
TTCGCCGCGCTCCAAACGGGCGATCTCCTCGGCGCGGGCCGCCAGGATCAGCGCCG
>Contig_98:35323-35886
GACGAAGCGCTCGCCAAGGCCGAAGAAGAAGGCCTGGATCTGGTCGAAATCCAGCCGCAG
>

with any length fasta sequences. The traiing ">" can be taken care of piping through | sed '$d' if need be. Please be aware that your desired output's "Contig_98" line is missing an "AG" at the end.

Last edited by RudiC; 4 Days Ago at 05:00 AM..
These 3 Users Gave Thanks to RudiC For This Post:
# 6  
That's exactly what I meant!

Thanks RudiC!
# 7  
awk version you could try:
Code:
awk 'BEGIN{FS=RS; RS=">"; ORS=""} FNR>1{A[$1]=RS $0} END{for(i in A) print A[i]}'  file1 file2

note: ensure that there are no excess trailing spaces as is the case with the file samples.

Last edited by Scrutinizer; 3 Days Ago at 01:50 PM..
These 3 Users Gave Thanks to Scrutinizer For This Post:
Login or Register to Reply

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
Help with reformat single-line multi-fasta into multi-line multi-fasta
patrick87
Input File: >Seq1 ASDADAFASFASFADGSDGFSDFSDFSDFSDFSDFSDFSDFSDFSDFSDFSD >Seq2 SDASDAQEQWEQeqAdfaasd >Seq3 ASDSALGHIUDFJANCAGPATHLACJHPAUTYNJKG ...... Desired Output File >Seq1 ASDADAFASF ASFADGSDGF SDFSDFSDFS DFSDFSDFSD FSDFSDFSDF SD >Seq2... Shell Programming and Scripting
4
Shell Programming and Scripting
Append file name to fasta file headers in Linux
Mauve
How do we append the file name to fasta file headers in multiple fasta-files in Linux?... UNIX for Dummies Questions & Answers
10
UNIX for Dummies Questions & Answers
Breaking a fasta formatted file into multiple files containing each gene separately
Ann Mc Cartney
Hey, I've been trying to break a massive fasta formatted file into files containing each gene separately. Could anyone help me? I've tried to use the following code but i've recieved errors every time: for i in *.rtf.out do awk '/^>/{f=++d".fasta"} {print > $i.out}' $i done... UNIX for Dummies Questions & Answers
1
UNIX for Dummies Questions & Answers
renaming (renumbering) fasta files
Oyster
I have a fasta file that looks like this: >Noname ACCAAAATAATTCATGATATACTCAGATCCATCTGAGGGTTTCACCACTTGTAGAGCTAT CAGAAGAATGTCAATCAACTGTCCGAGAAAAAAGAATCCCAGG >Noname ACTATAAACCCTATTTCTCTTTCTAAAAATTGAAATATTAAAGAAACTAGCACTAGCCTG ACCTTTAGCCAGACTTCTCACTCTTAATGCTGCGGACAAACAGA ... I want to...... UNIX for Dummies Questions & Answers
2
UNIX for Dummies Questions & Answers
grep FASTA files
Xterra
I would like to extract the sequences larger than 10 bases but shorter than 18 along with the identifier from a FASTA file that looks like this: > Seq I ACGACTAGACGATAGACGATAGA > Seq 2 ACGATGACGTAGCAGT > Seq 3 ACGATACGAT I know I can extract the IDs alone with the following code grep...... UNIX for Dummies Questions & Answers
3
UNIX for Dummies Questions & Answers

Featured Tech Videos