-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 で識別できる) などは複数行にあるため、1 回だけ出力したいと思います。次のように出力したいと思います:

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;
    }
}

%seen2 番目の列がハッシュに既に表示されている場合、これは行と外観を読み取ります。一致する場合、3 番目の列が同じであれば、その行を出力します。それ以外の場合は、後で参照できるように行を新しい行として保存します。

于 2013-02-25T16:52:20.230 に答える
1

あなたが示した出力は、あなたの問題ステートメントについて思いつく合理的な解釈と一致しないと言わざるを得ません」「「abc」または「def」の1つの出現を印刷したいと思います(列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 に答える