Несколько сортировок в текстовом файле - PullRequest
0 голосов
/ 20 марта 2011

Поиск не чувствительного к регистру поиска с использованием perl, так что если "!"обнаруживается в начале строки, начинается новая сортировка (только в разделе).

[test file]
! Sort Section
!
a
g
r
e
! New Sort Section
1
2
d
3
h

становится,

[test file]
! Sort Section
!
a
e
g
r
! New Sort Section
1
2
3
d
h

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Вот один из способов сделать это:

use strict;
use warnings;
my $filename = shift or die 'filename!';
my @sections;
my $current;
# input
open my $fh, '<', $filename or die "open $filename: $!";
while ( <$fh> ) {
    if ( m/^!/ ) {
        $current = [ $_ ];
        push @sections, $current;
    }
    else {
        push @$current, $_;
    }
}
close $fh;
# output
for ( @sections ) {
    print shift @$_; # print first line
    print sort @$_;  # print rest
}
1 голос
/ 20 марта 2011

Еще один, используя выходной файл. Что еще более важно, не загружая весь файл в память:

use strict;
use warnings;
sub output {
    my( $lines, $fh ) = @_;
    return unless @$lines;
    print $fh shift @$lines; # print first line
    print $fh sort { lc $a cmp lc $b } @$lines;  # print rest
    return;
}
# ==== main ============================================================
my $filename = shift or die 'filename!';
my $outfn = "$filename.out";
die "output file $outfn already exists, aborting\n" if -e $outfn;
# prereqs okay, set up input, output and sort buffer
open my $fh, '<', $filename or die "open $filename: $!";
open my $fhout, '>', $outfn or die "open $outfn: $!";
my $current = [];
# process data
while ( <$fh> ) {
    if ( m/^!/ ) {
        output $current, $fhout;
        $current = [ $_ ];
    }
    else {
        push @$current, $_;
    }
}
output $current, $fhout;
close $fhout;
close $fh;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...