Найти общие строки в нескольких файлах в соответствии с определенным значением и столбцами - PullRequest
0 голосов
/ 29 февраля 2012

Этот вопрос очень распространен, но у меня немного другое состояние.У меня есть 10 файлов, и я хочу извлечь общие строки.Я нашел ->

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2 file3 file4

или в Linux ->

comm [-1] [-2] [-3 ] file1 file2

Но если файл имеет 3 столбца (или более столбцов), и я хочу сравнить только первые 2 столбца (или более) и не последний столбец ->

file1 ->

Col1   col2   col3

A      1       0
A      2       1

file2

Col1   col2   col3

A        2    0.5
A        1    10
B        1    10

желаемый вывод ->

Col1   col2   file1  file2

A        1      0      10
A        2      1      0.5

Итакв выводе должно быть еще 10 столбцов, если у меня есть 10 файлов.Это также возможно как один вкладыш Perl (путем его изменения) или что мы можем сделать?

1 Ответ

1 голос
/ 29 февраля 2012
use strict;
use warnings;
use Array::Utils qw(intersect);

my $first_file=shift(@ARGV);
my @common_lines=();

#Grab all of the lines in the first file.

open(my $read,"<",$first_file) or die $!;

while(<$read>)
{
    chomp;
    my @arr=split /\t/;
    @arr=@arr[0,1]; #Only take first two columns.
    push @common_lines,join("\t",@arr);
}

close($read);
foreach my $file (@ARGV)
{
    my @matched_lines=();
    open($read,"<",$file) or die $!;
    while(<$read>)
    {
        chomp;
        my @arr=split /\t/;
        @arr=@arr[0,1];
        my $to_check=join("\t",@arr);

        #If $to_check is in @common_lines, put it in @matched_lines
        if(grep{$_ eq $to_check}@common_lines)
        {
            push @matched_lines,$to_check;
        }
    }
    close($read);

    #Take out elements of @common_lines that aren't in @matched_lines
    @common_lines=intersect(@common_lines,@matched_lines);

    unless(@common_lines)
    {
        print "No lines are common amongst the files!\n";
    }
}

foreach(@common_lines)
{
    print "$_\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...