2017-06-20 3 views
1

ここでは、2つの列で重複を含む行を削除する必要があります(row1とrow2は列1で同じ値を持ち、そして列1)ファイルのために同じことを行うタブがここAWK 2つの列から重複を特定しますが、最初のインスタンスを表示します

を区切られていることは、私はバッシュを使用していますが、これは中間のステップである

580769 580795 Del 
656123 657154 Del 

ouputを期待例データ

580615 580795 Del 
580769 580795 Del 
656123 657154 Del 
656123 657195 Del 

ですパイプラインで私は開発中です。

私はこの

awk 'seen[$1, $2]++ == 1' file 

awk 'n=x[$1,$2]{print n"\n"$0;} {x[$1,$2]=$0;}' file 

を使用しようとしましたが、私は任意の出力を得ることはありません。

ご意見をお寄せください ありがとうございます!

+0

wrtこれは私が開発しているパイプラインの中間段階です - あなたは、awkスクリプトの中にあるすべてのものを、別々のパイプとコマンドの束よりももっとうまくやるほうがよいでしょう。あなたの例を編集して、ある行のcolumn1と別の行のcolumn2に値があれば、期待される出力を表示する必要があります。これは、重複した行と見なされる場合はidkです。それをあなたの事例に含めることは、皆さんの努力ではなく、その要件を明確にすることです。 –

答えて

0

私が正しく理解していれば、あなたが行うことができます:

awk '{ f[$1]+=1; s[$2]+=1; if(f[$1]==1 && s[$2]==1) print $0;}' file

あなたはすべての行をキャプチャし、各列( F IRSTと econd)のための出現回数を数えます。 2つの列が新しい場合は、行を出力します。

1

あなたはこのようawkを使用することができます。

awk '!a[$1]++ && !b[$2]++' file 

580615 580795 Del 
656123 657154 Del 

これは、1列目と2列の一意の値を2つの連想配列abを保持します。

sortを用い
+1

こんにちは、ありがとうございました。 –

+0

これはうまくいっていることを知ってうれしいです。[この回答の左上に**チェックマーク**をクリックすることで答えをマークすることができます](http://meta.stackexchange.com/a/5235/160242) – anubhava

0

$ cat file

580615 580795 Del 
580769 580795 Del 
656123 657154 Del 
656123 657195 Del 
  1. $ sort -uk1,1 file | sort -uk2,2 
    

-k1,1は1行をソートし、重複を削除し、その後

-k2,2sortuniqを用い

  • 2行をソートし、重複

    を削除:

    $ sort -uk1,1 file | uniq -f1 
    
  • 出力リレー:

    580615 580795 Del 
    656123 657154 Del 
    

    のに-rを追加した場合sort

    $ sort -uk1,1r file | sort -uk2,2 
    

    その後、

    580769 580795 Del 
    656123 657154 Del 
    
    0

    試しouputを:Anubhavaのソリューションの少し簡単なバージョン。現在の行の最初のフィールドは$ 2は、現在の行を印刷する配列2に存在しない場合も同様に、アレイという名前の配列1中に存在しない場合!のARRAY1 [$ 1]を意味します。

    awk '!array1[$1] && !array2[$2]{print;} {array1[$1]=$1;array2[$2]=$2}' Input_file 
    

    は、だからここに条件をチェックします次に、インデックスが$ 1で値が$ 1である配列1に配列要素を作成し、インデックスが$ 2、値が$ 2の配列2を作成します。

    関連する問題