【问题标题】:Use Perl to manipulate file from within Octave使用 Perl 在 Octave 中操作文件
【发布时间】:2012-08-29 04:18:08
【问题描述】:

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

save data_for_training -ascii train_data

然后手动且繁琐地编辑保存的文件,然后通过首先读取编辑的文件以新的不同的 Octave 例程恢复操作。从概念上讲,所需的文件操作与this SO posting 中概述的相反,即保存的文件看起来像这样

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 标签标记了这个问题,因为有 Perl and Python functions in Octave,所以我假设我可以通过编写脚本文件来完成上述操作,从而轻松实现我想要的。如果我在这个假设中是正确的,任何人都可以给我 Perl/Python 脚本文件的开始/网络链接 - 我以前从未使用过吗?

【问题讨论】:

  • 我认为您需要详细说明数据操作的条件。我们无法猜测您要在哪里插入换行符。

标签: python perl file octave file-manipulation


【解决方案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

【讨论】:

  • 行尾有空格。如果您的实际数据确实如此,您需要将$ 更改为\s*\z
【解决方案2】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2011-09-14
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多