Perl Merge file

前端 未结 4 847
無奈伤痛
無奈伤痛 2021-01-15 06:51

I have 3 or multiple files I need to merge, the data looks like this..

file 1
0334.45656
0334.45678
0335.67899
file 2
0334.89765
0335.12346
0335.56789
file 3         


        
4条回答
  •  长情又很酷
    2021-01-15 07:15

    Using Miller's idea in a more reusable way,

    use strict;
    use warnings;
    
    sub get_sort_iterator {
      my @fhs = map {open my $fh, '<', $_ or die $!; $fh} @_;
      my @d;
    
      return sub {
        for my $i (0 .. $#fhs) {
          # skip to next file handle if it doesn't exists or we have value in $d[$i]
          next if !$fhs[$i] or defined $d[$i];
    
          # reading from $fhs[$i] file handle was success?
          if ( defined($d[$i] = readline($fhs[$i])) ) { chomp($d[$i]) }
          # file handle at EOF, not needed any more
          else  { undef $fhs[$i] }
        }
        # compare as numbers, return undef if no more data
        my ($index) = sort {$d[$a] <=> $d[$b]} grep { defined $d[$_] } 0..$#d
          or return;
    
        # return value from $d[$index], and set it to undef
        return delete $d[$index];
      };
    }
    
    my $iter = get_sort_iterator(@ARGV);
    while (defined(my $x = $iter->())) {
      print "$x\n";
    }
    

    output

    0334.12345
    0334.45656
    0334.45678
    0334.89765
    0335.12346
    0335.45678
    0335.56789
    0335.67899
    0335.98764
    

提交回复
热议问题