Perl:如何打印第二个字段为0且第三个字段为1的所有行

时间:2015-12-08 11:38:09

标签: perl

如何在Perl中打印第二个字段为0且第三个字段为1的所有行。我特意寻找Perl解决方案,因为AIX Server中的限制很少(shell版本很旧),因此shell脚本无法正常工作。以下是示例文件:

237576 6 1 RMAN_Backup Default_Backup clmjk 1442149024 0000000055 1442149079 23328
237575 0 3 RMAN_Backup Default_Backup clmjk 1442148956 0000000053 1442149009 2848
237574 0 1 RMAN_Backup Default_Backup clmjk 1442148954 0000000045 1442148999 544
237573 0 1 RMAN_Backup Default_Backup clmjk 1442145436 0000000053 1442145489 23328
237572 0 3 RMAN_Backup Default_Backup clmjk 1442145352 0000000047 1442145399 544

3 个答案:

答案 0 :(得分:4)

作为一个单行:

perl -ane 'print if 0 == $F[1] && 1 == $F[2]' input-file
  • -n逐行读取输入行
  • -a将空格上的输入拆分为@F数组

答案 1 :(得分:1)

逐行读取文件并用空格分割,然后检查第二个字段是否为0,第三个字段是否为1,将其写入输出文件。

use warnings;
use strict;

open my $fh, "<", "file.txt" or die $!;
open my $fhout, ">", "outfile.txt" or die $!;

while (my $line = <$fh>)
{
    chomp $line;
    my @data = split (' ', $line);
    if ($data[1] == 0 && $data[2] == 1)
    {
        print $fhout $line, "\n";
    }
}
close $fh;
close $fhout;

输出(在输出文件'outfile.txt'中):

237574 0 1 RMAN_Backup Default_Backup clmjk 1442148954 0000000045 1442148999 544
237573 0 1 RMAN_Backup Default_Backup clmjk 1442145436 0000000053 1442145489 23328

答案 2 :(得分:1)

这种东西非常适合用作Unix过滤器(从STDIN读取并写入STDOUT)。

use warnings;
use strict;

while (<>) {
  my @data = split;
  print if $data[1] == 0 && $data[2] == 1;
}

像这样运行:

$ ./filter < input_file > output_file

事实上,将其编写为命令行程序

非常简单
$ perl -ane 'print if $F[1] == 0 && $F[2] == 1' input_file > output_file