入力
1 DX
ADA
4 O1
3 I1
C1
2 LA
FTAS
TT66
期待される出力
1 DX
ADA
2 LA
FTAS
TT66
3 I1
C1
4 O1
指示
sort -n 入力
上記のようにファイルを数値順にソートしてみました。しかし、null 値もソートされたため、構造体が台無しになりました。助けてくれてありがとう。
perl -nwe 'if (/^(\d+)/) { $num = $1; } $a[$num] .= $_;
END { print for grep defined, @a }' input.txt
配列を使用して、見つかった行番号に従って行を格納するか、番号が見つからない場合は最後の番号を格納します。次に、配列を印刷します。warnings スイッチ-w
を使用しない場合は、使用する必要はありませんgrep defined
。警告は未使用の配列要素 (この場合は 0) に表示されるためです。
行番号が重複している場合は、前のエントリに行を追加するので便利です。また、配列要素はすでにソートされているため、ソートは必要ありません。
この出力は、最新の初期番号を追跡し、現在の行をハッシュの適切な要素に追加します。ハッシュ内のデータは、キーの番号順に出力されます。
use strict;
use warnings;
my $n;
my %data;
while (<DATA>) {
$n = $1 if /^(\d+)/;
$data{$n} .= $_ if $n;
}
print $_ for map $data{$_}, sort { $a <=> $b } keys %data;
__DATA__
1 DX
ADA
4 O1
3 I1
C1
2 LA
FTAS
TT66
出力
1 DX
ADA
2 LA
FTAS
TT66
3 I1
C1
4 O1
アップデート
ファイル全体を読み取り、数字が続く改行ごとに分割し、それらのレコードを最初の番号の番号順に並べ替えるこの代替方法を好むかもしれません。出力は前のソリューションと同じです。
use strict;
use warnings;
local $/;
print for sort {
my ($aa, $bb) = map /^(\d+)/, $a, $b;
$aa <=> $bb;
} split /(?<=\n)(?=\d)/, <DATA>;
__DATA__
1 DX
ADA
4 O1
3 I1
C1
2 LA
FTAS
TT66