これを perl で行う場合は、ファイル全体を丸呑みしてマンジし、シーケンス番号に基づいて元の生の行をソートできるようにします。あなたのファイル形式がどの程度一貫しているかはわかりませんが、1 つの perl アプローチは次のようになります。
#!/usr/bin/perl -w
my @data;
# slurp in each line, and tag it by its sequence number
foreach my $line ( <STDIN> )
{
if ($line =~ /sequence=(\S+)/)
{
push @data, { sequence => $1, line => $line };
} else
{
die "unhandled line: $line"; # only if needed
}
}
# sort the lines by their sequence number into @sorted
my @sorted = sort { $a->{sequence} <=> $b->{sequence} } @data;
# generate the final result by extracting the original lines
# from the sorted array and concatenating them
my $result = join("", map { $_->{line} } @sorted);
# output the sorted result
print $result;
上記の例でこれを試してみましたが、うまくいきました。die
スクリプトが安全に無視できる「ガベージ」行が入力に含まれている可能性がある場合は、その行をマッサージすることができます。
また、昇順と降順を切り替える必要がある場合は、次の行で and を入れ替えることができ$a
ます$b
。
my @sorted = sort { $a->{sequence} <=> $b->{sequence} } @data;
シーケンス番号が純粋な数値ではない場合、またはそれらを文字列として比較する場合は、<=>
演算子をcmp
次のように変更します。
my @sorted = sort { $a->{sequence} cmp $b->{sequence} } @data;