-1

我有一个如下所示的文件:

LINE abc 1 somevalue
LINE abc 1 somevalue
LINE abc 1 somevalue
LINE def 2 somevalue
LINE def 2 somevalue
LINE abc 3 somevalue
LINE abc 3 somevalue
LINE mno 4 somevalue
LINE mno 4 somevalue
LINE def 5 somevalue
LINE def 5 somevalue

我想打印一次出现的“abc”或“def”(可以由第 3 列标识)等,因为它存在于多行中。我想得到输出:

LINE abc 1 somevalue
LINE abc 1 somevalue
LINE abc 1 somevalue
LINE def 2 somevalue
LINE def 2 somevalue
LINE mno 4 somevalue
LINE mno 4 somevalue

任何人都可以在 perl 中帮助我吗?

4

2 回答 2

3

您可以将已经看到的行保存在哈希中并跳过已经识别的行

use strict;
use warnings;

my %seen;

while (<>) {
    my @cols = split;
    if (defined($seen{$cols[1]})) {
        if ($seen{$cols[1]} == $cols[2]) {
            print;
        }
    } else {
        $seen{$cols[1]} = $cols[2];
        print;
    }
}

%seen如果第二列已经出现在散列中,这会读取行并查看。如果是,则打印该行,如果第三列相同。否则,它将该行存储为新行以供以后参考。

于 2013-02-25T16:52:20.230 回答
1

我必须说,您显示的输出与我可以对您的问题陈述提出的任何合理解释不匹配“我想打印一次出现的 'abc' 或 'def' (可以通过第 3 列识别) "

#!/usr/bin/env perl

while (my $line = <DATA>) {
    my @cols = split ' ', $line;
    next if ($cols[1] =~ /\A(?:abc|def)\z/) # if col 2 is abc or def
        and $cols[2] != 1;                  # and col 3 is not 1, then skip
    print $line;                            # otherwise print
}

__DATA__
LINE abc 1 somevalue
LINE abc 1 somevalue
LINE abc 1 somevalue
LINE def 2 somevalue
LINE def 2 somevalue
LINE abc 3 somevalue
LINE abc 3 somevalue
LINE mno 4 somevalue
LINE mno 4 somevalue
LINE def 5 somevalue
LINE def 5 somevalue

或者,如果你想在命令行上使用它,

$ perl -ane '$F[1] =~ /\A(?:abc|def)\z/ and $F[2] != 1 and next or print' input

于 2013-02-25T17:04:34.530 回答