Perl合并列并从不同的文本文件添加新列

时间:2018-09-25 04:21:38

标签: perl merge

我是Perl的初学者,我想合并并在新列中添加不同文本文件的内容。

我的第一个文件有两列。

chr1    14548  
chr1    15240272  
chr1    68723  
chr1    80040  
chr1    29627919  
chr1    63585628   
chr1    177110  
chr1    199016  
chr1    63600119 

第二个文件只有一列

chr1    15240272  
chr1    29627919  
chr1    63585628  
chr1    63600119  
chr1    63608794  
chr1    63620650  
chr1    65986172  
chr1    81620996  
chr1    89015871  
chr1    96384184 

第三个文件只有一列

chr1    3014448   
chr1    3068620  
chr1    3079928  
chr1    3082514  
chr1    3176980   
chr1    3198886  
chr1    3212349  
chr1    3249189  
chr1    3265742  
chr1    3273096

我希望我的输出有4列。

chr1    14548   chr1    3014448  
chr1    15240272   0    0  
chr1    68723   chr1    3068620  
chr1    80040   chr1    3079928  
chr1    29627919   0    0  
chr1    82626   chr1    3082514  
chr1    63585628   0    0  
chr1    177110  chr1    3176980  
chr1    199016  chr1    3198886  
chr1    212740  chr1    3212349

如果第二个文件中的column1,则在输出文件的第2列和第3列中添加0值。否则,逐行合并file1和3中的列。 (chr1 14548 = chr1 3014448; chr1 68723 = chr1 3068620,它们全都取决于序列顺序,如果我对列进行排序,则无法识别chr1 14548 = what

我的Perl代码

#!/usr/bin/perl
use strict;
use warnings;

open my $input1, '<', "file1.txt"
    or die $!;
open my $input2, '<', "file2.txt"
    or die $!;
open my $input3, '<', "file3.txt"
    or die $!;
open my $outfile, '>', "output.txt"
    or die $!;
while ( my $l1 = <$input1> ) {
  my $l2 = <$input2>;
  my $l3 = <$input3>;
  chomp $l1;
  chomp $l2;
  chomp $l3;

  my @columns1 = split( /\t/, $l1 );
  my @columns2 = split( /\t/, $l2 );
  my @columns3 = split( /\t/, $l3 );
  if ( $columns2[1] == $columns1[1] ) {
    print $outfile join( "\t", $columns1[0], $columns1[1], '0', '0' ), "\n";
  }
  else {
    print $outfile
        join( "\t", $columns1[0], $columns1[1], $columns3[0], $columns3[1] ),
        "\n";
  }
}
close;

我的Perl脚本不能很好地工作。无法在输出中添加0值。

如果有人可以帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我想我明白了……尽管我对申请书一无所知。

主要变化是,您需要根据需要读取文件2和3,以使所有内容对齐。

#!/usr/bin/perl
use strict;
use warnings;

open my $input1, '<', "file1.txt" or die $!;
open my $input2, '<', "file2.txt" or die $!;
open my $input3, '<', "file3.txt" or die $!;
open my $outfile, '>', "output.txt" or die $!;

my $line2 = <$input2>;
chomp($line2);
my @columns2 = split(/\t/, $line2);

while ( my $line1 = <$input1> ) {
    chomp($line1);
    my @columns1 = split(/\t/, $line1);

    if (@columns1[1] eq @columns2[1]) {
        # Line from input 1 matches line from input 2
        # Prep for next match and output zeros

        $line2 = <$input2>;
        chomp($line2);
        @columns2 = split(/\t/, $line2);

        print($outfile join("\t", @columns1, 0, 0), "\n");
    } else {
        # Input 1 does not match input 2
        # Read input 3 and print
        my $line3 = <$input3>;
        print($outfile  $line2, "\t", $line3);
    }
}
# Script ends, file handles are automatically closed