1

次の 2 つの 1 行の perl コードを、次の行に進む前にファイルの行で両方を実行する単一の perl スクリプトに結合しようとしています。これは私自身のオリジナルのコードではないことに注意してください。非常に思慮深くここに提供されています:

1

perl -pae 'print $/ if (defined $x && $x ne $F[0]); $x = $F[0];' DF-data2pfa.csv >DF-data2pfb.txt

2

perl -pae 'print $/ if (defined $x && $x ne $F[3]); $x = $F[3];' DF-data2pfb.txt >DF-data2pfc.txt

スクリプトは、私が望んでいることを正確に実行します (F[0]データセット内の行のフィールドを前の行のフィールドと比較しF[0]、それらが異なる場合はそれらのエントリの間に空白行を追加します)。単一の行で、両方を前の行と比較します。恥ずかしいことに、次々と実行しようとしましたが、スクリプトが前のスクリプトによって追加された空白行に遭遇するたびに、これが余分な空白行を追加していることに気づきませんでした。これは、これを入力しようとしているプログラムには受け入れられませんへのデータ。F[0]F[3]

そこで、Deparseツールを使用して両方をスクリプト形式に変換し、elsifステートメントを使用して 2 番目を 1 番目に追加しようとしました。これがぐちゃぐちゃになりました。paeまた、スクリプトでコマンドラインの機能を実現する方法もわかりません。スクリプトで が必要かどうかはわかりませんeが、最初に各行を出力してから配列に分割する ( with pa) ことは、このコード全体にとってかなり不可欠なコンポーネントであり、ここでそれを達成する方法がわかりません。

これが私が得たものです:

while (defined($_ = <ARGV>)) {
    our(@F) = split(' ', $_, 0);
$x = $F[0];
$y = $F[3];
if defined $x and $x ne $F[0];
elsif defined $y and $y ne $F[3];
   print $/ 
}
continue {
    die "-p destination: $!\n" unless print $_;
}

deparseここで不要な場合は、モジュールを使用しないことにもオープンです。あなたが提供できる助け/説明をありがとう!

4

2 に答える 2

2

ワンライナーにしては少し冗長になっていますが、次のようにすることができます。

perl -pae 'print $/ if ((defined $x && $x ne $F[0]) && (defined $y && $y ne $F[3])); $x = $F[0]; $y = $F[3]' DF-data2pfa.csv >DF-data2pfb.txt

またはスクリプトとして

open my $fh, "<", "input_file_name";
open my $out, ">", "output_file_name";
my ($x, $y);
foreach (<$fh>) {
    my @F = split(' ', $_);
    if ( ( defined($x) && $x ne $F[0] ) && (defined($y) && $y ne $F[3]) ) {
        print $OUT $\;
    }
    $x = $F[0];
    $y = $F[3];
    print $OUT $_;
}

あなたの要件を正しく読んでいるかどうかわかりません.$F[0]または$F[3]のいずれかが前の行と一致する場合に余分な行を印刷する必要がある場合、条件は次のようになります:

( ( defined($x) && $x ne $F[0] ) || (defined($y) && $y ne $F[3]) )
于 2013-03-11T17:15:55.840 に答える
1

私はあなたが何をしているのか 100% 確信が持てないので、このスクリプトはあなたが望んでいるものではないかもしれませんが、うまくいけば、あなたが始めることができるでしょう. 特定のエラーを防ぐのに役立つプラグマstrictとプラグマを使用します。warnings

#!/usr/bin/env perl

use strict;
use warnings;

my ($x, $y, @F);
while ( <> ) {
  @F = split ' ';
  if ( defined $x and $x ne $F[0] ) {
    print $/;
  } elsif ( defined $y and $y ne $F[3] ) {
    print $/;
  }
  $x = $F[0];
  $y = $F[3];
  print;
}

これは$_変数を暗黙的に使用します(while暗黙的に設定し、split暗黙的に使用します)。また、条件ステートメントがどのように表示されるかを示します。posfix スタイルで使用されていない場合、条件には丸括弧が必要です。私はブロックに残しましたcontinueが、実際には使用する必要はありませんでした。これはおそらく逆解析の残りであり、おそらく while ループの最後に行く可能性があります (そして print も暗黙的に使用$_できます)。最後に、<>オペレーターはマジックオープン/読み取りオペレーターであり、ARGV 内のファイルを順番に使用するか、必要に応じて STDIN を使用します。

さらにヘルプが必要な場合は、ping を実行してください。

于 2013-03-11T17:15:02.313 に答える