将两行Perl命令合并到一个脚本中

时间:2013-03-11 16:29:31

标签: perl if-statement

我正在尝试将以下两行perl代码组合到一个perl脚本中,该脚本在进行到下一行之前在文件的一行上执行。请注意,这不是我自己的原始代码,这里非常仔细地提供:Adding a blank line between unrelated data entries

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语句将第二个添加到第一个。这变得凌乱。另外我不确定如何在脚本中实现命令行的pae功能。我不确定脚本中是否需要e但似乎首先打印每一行然后将其拆分为一个数组(带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模块。感谢您提供的任何帮助/解释!

2 个答案:

答案 0 :(得分: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]与前一行匹配,那么条件将是:< / p>

( ( defined($x) && $x ne $F[0] ) || (defined($y) && $y ne $F[3]) )

答案 1 :(得分:1)

我不是100%确定你在做什么,所以这个脚本可能不是你想要的,但它希望能让你开始。它使用strictwarnings pragma来帮助您防止出现某些错误。

#!/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块,但实际上我从来不需要使用一个,这可能是deparse的残余,并且可能在while循环结束时(并且print可以隐式使用{ {1}}也是。最后,$_运算符是魔术打开/读取运算符,它将依次使用ARGV中的文件或根据需要使用STDIN。

如果您需要更多帮助,只需ping。