Perl объединяет столбцы и добавляет новые столбцы из разных текстовых файлов - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в Perl и хочу объединить и добавить новый столбец с содержимым различных текстовых файлов.

Мой 1-й файл имеет два столбца.

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

2-й файлесть один столбец

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

3-й файл имеет один столбец

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-м файле, добавить значение 0 в столбцы 2 и 3 выходного файла.иначе объединить столбец из файла1 и 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 голосов
/ 26 сентября 2018

Я думаю, что у меня есть ... Хотя я понятия не имею о приложении.

Основное изменение заключается в том, что вам нужно читать файлы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...