出力列から重複排除

出力列から重複排除

2つの列でこのようなペア別比較を実行する状況で冗長性を排除する* NIX方法は何ですか?

    A B
    B A
    A C
    A D
    C A
    D A 
    B C
    C B

A B同じ比較を示すために、B Aデータセットからこれらの冗長性を排除したいと思います。最終結果は

A B
A C
A D
B C

答え1

doit () 
{ 
    awk '{
           key=$1<=$2? $1 FS $2 : $2 FS $1; 
           if (!seen[key]) print $1,$2
           seen[key]=1
    }'
}
$ doit <test
A B
A C
A D
B C
$

(またはKristanの答えがとてもフレンドリーなので、より簡潔に言えば)

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'

データの空白を気にしない場合は、さらに減らすことができます。

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'

)

これはFSawk の「フィールド区切り文字」変数で、キーフィールド間の境界が正しく識別されるようにするために使用されます。私のソースでは一緒に実行され、$1$2Stephane Chazelasは指摘したようにA BCレプリカAB Cとして扱われます。

答え2

パールでは:

perl -lane 'print if !$seen{join(" ", sort @F)}++'

これは、フィールドを並べ替えて接続(「CA」がキー「AC」になる)に追加することによって行われます$seen。なぜなら、条件節は真の場合にのみゼロと評価されるからです。増分後は、この比較が最初に発生したときにのみ発生します。

答え3

一意の行の要素の順序を維持しても構わない場合は、各行を並べ替え、行を並べ替えて重複項目を削除できます。

awk '{ if ($2 < $1) print $2, $1; else print $1, $2; }' | sort -u

関連情報