如果我在 perl 中执行此操作,我会将整个文件吞入其中并进行处理,以便我可以根据它们的序列号对原始原始行进行排序。我不确定您的文件格式有多一致,但一种 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
如果您可以在输入中包含脚本可以安全忽略的“垃圾”行,您可能会按摩该行。
另外,如果你需要在升序和降序之间切换,你可以在这一行交换$a
和:$b
my @sorted = sort { $a->{sequence} <=> $b->{sequence} } @data;
如果序列号不是纯数字,或者您想将它们作为字符串进行比较,请将<=>
运算符更改为cmp
:
my @sorted = sort { $a->{sequence} cmp $b->{sequence} } @data;