selami
selami

Reputation: 89

Adding some columns into a file from two files using perl

I have two input files (rmsd1.xvg and rmsd2.xvg). I want to write them into output file after selecting a different column from each input file. My input files and code are the following:

rmsd1.xvg:

# GROup of MAchos and Cynical Suckers
#
@    title "RMSD"
@    xaxis  label "Time (ps)"
@    yaxis  label "RMSD (nm)"
1.0000000    0.0000009
20.0000000    0.1478001
40.0000000    0.1648600
60.0000000    0.1645018
80.0000000    0.1786710
100.0000000    0.2115960

rmsd2.xvg:

# GROup of MAchos and Cynical Suckers
#
@    title "RMSD"
@    xaxis  label "Time (ps)"
@    yaxis  label "RMSD (nm)"
1.0000000    0.1000009
20.0000000    0.2478001
40.0000000    0.3648600
60.0000000    0.4645018
80.0000000    0.5786710
100.0000000    0.6115960

My code:

#!/usr/bin/perl 

use strict;
use warnings;

# Open file1 to read
open my $input_file1, '<', "rmsd1.xvg" or die qq{Failed to open "rmsd1.xvg" for writing: $!};

# Open file2 to read
open my $input_file2, '<', "rmsd2.xvg" or die qq{Failed to open "rmsd2.xvg" for writing: $!};

# Open new file to write
open my $out_file, '>', "out_file.xvg" or die qq{Failed to open "out_file.xvg" for writing: $!};


while(<$input_file1>)
{ 
 next if /(^\s*$)|(^#)|(^@)/;
 my @columns1 = split;
 print $out_file join("\t", $columns1[0],$columns1[1], "\n");
}

while(<$input_file2>)
{ 
 next if /(^\s*$)|(^#)|(^@)/;
 my @columns2 = split;
 print $out_file join("\t", $columns2[1]), "\n";
}
close($input_file1);
close($input_file2);
close($out_file);

My code gives me a output as the following.

Output file:

1.0000000    0.0000009
20.0000000    0.1478001
40.0000000    0.1648600
60.0000000    0.1645018
80.0000000    0.1786710
100.0000000    0.2115960
0.1000009
0.2478001
0.3648600
0.4645018
0.5786710
0.6115960

Whereas i want to get a output as the following. That is all columns should be side by side. How can i get this output?

Requested:

1.0000000    0.0000009    0.1000009   
20.0000000    0.1478001    0.2478001
40.0000000    0.1648600    0.3648600
60.0000000    0.1645018    0.4645018
80.0000000    0.1786710    0.5786710
100.0000000    0.2115960     0.6115960

Upvotes: 0

Views: 65

Answers (1)

Charlie Dalsass
Charlie Dalsass

Reputation: 2014

You are writing the output from file1, followed by file2, which is what the output reflects.

Read in the input from the first file, and store data in a hash. Then read input from second file and print records from both files at the end.

Upvotes: 1

Related Questions