2017-06-06 4 views
0

これは、uniqコマンドを実行するようなものでなければならないが、列によって実行する必要があります。例えば:Linuxで重複した列を削除する最も良い方法

A B C B
A C B C
A A A A

第二及び第四列は同一です。次の結果を得るための最良の方法はどれですか?

A B C
C B
A A A

しかし、最初に、それは多くの行のUNIQコマンドと同じように、同一である列は不明です。

+1

列がユニークであることを意図している場合、最後の列は「A A」ではなく「A A A」であるべきですか? –

答えて

0

レスキューへのPerl!

@c = ([ 'A', 'A', 'A' ], 
     [ 'B', 'C', 'A' ], 
     [ 'C', 'B', 'A' ], 
     [ 'B', 'C', 'A' ]); 

}{(いわゆる「エスキモー挨拶」)後のコードの実行からライン毎のコードの実行を分離する:それは次の構造を作成する、すなわち

perl -lane ' 
    push @{ $c[$_] }, $F[$_] for 0 .. $#F; 
    }{ 
    for (@c) { 
     $s = join "|", @$_; 
     $seen{$s}++ or push @r, $_; 
    } 
    print join " ", map shift @$_, @r while @{ $r[0] } 
    ' -- inputfile 

は、最初の行は、入力を旋回します入力全体が処理されました。これは@cアレイを歩くのみ等A|A|AB|C|A、ようにそれらのそれぞれからの文字列を作成し、%seenハッシュに格納することにより、(一意の列を保持する。

構造があろう

@r = ([ 'A', 'A', 'A' ], 
     [ 'B', 'C', 'A' ], 
     [ 'C', 'B', 'A' ]); 
それが戻って結果を旋回させる。すなわち

とハッシュが

%seen = ('B|C|A' => 2, 
      'A|A|A' => 1, 
      'C|B|A' => 1 
); 

のようになります。最後の印刷は、各列の最初の要素をシフト。

関連する問題