-2

我需要在例程中间从 Octave 中操作文件。目前我通过从 Octave 保存一个文件来结束这个例程

save data_for_training -ascii train_data

然后手动,乏味地编辑保存的文件,然后通过首先读取编辑的文件,在一个新的不同的 Octave 例程中恢复操作。从概念上讲,所需的文件操作与此 SO 发布中概述的操作相反,即保存的文件看起来像这样

a b c d e f ... z 0 0 0 0 1  
g h i j k l ... z 0 0 0 1 0

必须被操纵到

a b c d e f ... z  
0 0 0 0 1  
g h i j k l ... z  
0 0 0 1 0

其中字母实际上是数字,但为了清楚起见,我使用了字母。换行符总是在每行倒数第五个数字之前,即每行的最后一个 0 0 0 0 1 需要移到该行下方,并且所有行上的所有数字都用空格分隔。

我已经用 Perl 和 Python 标签标记了这个问题,因为Octave 中有 Perl 和 Python 函数,所以我假设我可以通过编写脚本文件来执行上述操作来轻松实现我想要的。如果我在这个假设中是正确的,任何人都可以给我 Perl/Python 脚本文件的开始/网络链接 - 我以前从未使用过吗?

4

2 回答 2

1
#!/usr/bin/env perl
while (<>) {
   my @f = split;
   print("@f[0..$#f-5]\n@f[-5..-1]\n");
}

或者

#!/usr/bin/env perl
while (<>) {
   s/\S\K\s+(?=\S+(?:\s+\S+){4}$)/\n/;
   print;
}

用法:

perl script.pl file.in >file.out

或者

script.pl file.in >file.out   # Requires: chmod u+x script.pl

或者

perl -pale'$_="@F[0..$#F-5]\n@F[-5..-1]"' file.in >file.out

或者

perl -pe's/\S\K\s+(?=\S+(?:\s+\S+){4}$)/\n/' file.in >file.out
于 2012-09-04T15:20:01.340 回答
0
open my $input,  '<', 'data_for_training';
open my $output, '>', 'data_for_training2';

while( <$input> ) {
    chomp;
    ( my $line  = $_ ) =~ s/((\s\d+){5})$//;
    ( my $line2 = $1 ) =~ s/^\s//;

    print $output "$line\n$line2\n";
}
close $input;
close $output;
于 2012-09-04T15:21:47.470 回答