大文件的排序处理(多路归并)

排序文件:
1.txt:
@12@vip.com#20120307/1
BCDBCDBD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
...
2.txt
@14@vip.com#20120307/1
AABCCCCD
+
AAAAAAAA
@12@vip.com#20120307/1
BCACACAD
+
AAAAAAAA
...
————————————————
结果:
@14@vip.com#20120307/1
AABCCCCD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
@12@vip.com#20120307/1
BCACACAD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
。。。。。
----------------------------------

1: 文件分块:
按照每部分的第二行, 前3个字符分块
BCDBCDBD -> B文件
CACACAD   -> C文件
AABCCCCD -> A文件
......

2: 排序
排序  A文件
排序  B文件
排序  C文件
......
-----------------------------------------------------------
 
-----------------------------------------------------------
#!/usr/bin/perl
my $head = 5;  # 或多或少
my %file;
@ARGV = qw/test.txt/;

while (<>) {
    my $line2 = <>;
    my $key = substr $line2, 0, $head;
    unless ( $file{$key} ) {
        open my $f, '>', "/tmp/$key";
        $file{$key} = $f;
    }
    print { $file{$key} } $_, $line2, <>.<>;
}

close $file{$_} for keys %file;
open my $result, '>', 'result';

for my $file ( sort keys %file ) {
    @ARGV = "/tmp/$file";
    my @group;
    push @group, [ $_, ~~<>, <>.<> ] while <>;
    print $result @$_ for sort { $a->[1] cmp $b->[1] } @group;
    unlink "/tmp/$file";
}

print scalar keys %file, ' files: BYE!';
——————————————————————————————————————————————
xargs -n4 < infile |sort -k2 |xargs -n1

 

posted on 2013-12-13 10:42  三川  阅读(500)  评论(0编辑  收藏  举报