我的数据文件是这样的:
*jlskdfjsdlkfjlkdsf
*jsdklfjsldkfjlsdkfj
*.Ta=351 Tb=sdf c=132 subckt=dff d=1324153 s=4165165 d=53135 s=sdlkfj
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff5.d), (Ta - Tb) = (2 - 1) = 9.24523e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff1.d), (Ta - Tb) = (2 - 1) = 3.21533e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff4.d), (Ta - Tb) = (2 - 1) = 8.84233e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff3.d), (Ta - Tb) = (2 - 1) = 7.28523e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff2.d), (Ta - Tb) = (2 - 1) = 4.21533e-10
*.Ta=351 Tb=sdf c=132 subckt=dff d=1324153 s=4165165 d=53135 s=sdlkfj
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff2.d), (Ta - Tb) = (2 - 1) = 2.21533e-08
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff5.d), (Ta - Tb) = (2 - 1) = 8.21533e-08
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff3.d), (Ta - Tb) = (2 - 1) = 4.21533e-09
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff4.d), (Ta - Tb) = (2 - 1) = 6.21533e-09
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff1.d), (Ta - Tb) = (2 - 1) = 1.21533e-09
我到目前为止拥有的Perl代码如下:
open (my $file, "data.txt");
@data=<$file>;
close ($file);
open ($file, ">","data2.txt");
for (@data,undef) {
if (defined && /^\:.*(\d+)\n/) {
push @a, [$1,$_];
next }
print $file $_->[1]
for sort { $a->[0] <=> $b->[0] }
splice @a;
print $file $_ if defined ;
}
close ($file);
我不确定如何找到最后一个科学计数法数字并将其从小到大排序。
按等级排序的相同数据是这样的(最终格式):
*jlskdfjsdlkfjlkdsf
*jsdklfjsldkfjlsdkfj
*.Ta=351 Tb=sdf c=132 subckt=dff d=1324153 s=4165165 d=53135 s=sdlkfj
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff1.d), (Ta - Tb) = (2 - 1) = 3.21533e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff2.d), (Ta - Tb) = (2 - 1) = 4.21533e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff3.d), (Ta - Tb) = (2 - 1) = 7.28523e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff4.d), (Ta - Tb) = (2 - 1) = 8.84233e-10
: hold, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff5.d), (Ta - Tb) = (2 - 1) = 9.24523e-10
*.Ta=351 Tb=sdf c=132 subckt=dff d=1324153 s=4165165 d=53135 s=sdlkfj
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff1.d), (Ta - Tb) = (2 - 1) = 1.21533e-09
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff3.d), (Ta - Tb) = (2 - 1) = 4.21533e-09
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff4.d), (Ta - Tb) = (2 - 1) = 6.21533e-09
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff2.d), (Ta - Tb) = (2 - 1) = 2.21533e-08
: setup, sig=(xpbsa.abcd.diff0.d), ref=(xpbsa.abcd.diff5.d), (Ta - Tb) = (2 - 1) = 8.21533e-08
您的正则表达式过于贪婪。这不太贪心:
if ( defined && /^\:.*=\s+(\S+)\n/ ) {
例如,如果在打印到输出文件之前先打印@a
的内容,则将看到它仅包含最后一位数字(0),而不是整个科学编号(3.21533e-10)。 。
类似:
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
open my $data, "<", "data.txt";
open my $out, ">", "data2.txt";
my @lines;
while (<$data>) {
if (/^\*/) {
print $out $_;
next;
} elsif (/^:/ && /\s+(\S+)\s*$/) {
push @lines, [$1, $_];
} elsif ($_ eq "\n") {
print $out $_->[1] for sort { $a->[0] <=> $b->[0] } @lines;
@lines = ();
print $out "\n";
} else {
die "Bad line $_";
}
}
print $out $_->[1] for sort { $a->[0] <=> $b->[0] } @lines;
close $data;
close $out;
关键位是print $out $_->[1] for sort { $a->[0] <=> $b->[0] } @lines;
行,它们按末尾的数字排序后打印出实际的行。