我如何在不影响格式的情况下对科学记数法进行排序

问题描述 投票:1回答:2

我的数据文件是这样的:

*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
perl scientific-notation
2个回答
0
投票

您的正则表达式过于贪婪。这不太贪心:

if ( defined && /^\:.*=\s+(\S+)\n/ ) {

例如,如果在打印到输出文件之前先打印@a的内容,则将看到它仅包含最后一位数字(0),而不是整个科学编号(3.21533e-10)。 。


0
投票

类似:

#!/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;行,它们按末尾的数字排序后打印出实际的行。

© www.soinside.com 2019 - 2024. All rights reserved.