2017-02-18 5 views
2

私は別のフィールドに基づいて重複した行のセットを排除しようとしています。awk配列を使用して別のフィールドに基づいて重複列を削除しますか?

cat file.txt

1 345 a blue 
1 345 b blue 
3 452 c blue 
3 342 d green 
3 342 e green 
1 345 f green 

Iフィールド1及び2に基づいて、重複行を削除したいが、別々に各色のであろう。所望の出力:

for i in $(awk '{ print $4 }' file.txt | sort -u); do 
    grep -w ${i} | 
    awk '!x[$1,$2]++' >> output.txt 
done 

しかし、これは遅いです:

1 345 a blue 
3 452 c blue 
3 342 d green 
1 345 f green 

私は色以上for loopその繰り返し処理を使用して、この出力を達成することができます。ループを使用せずにこの出力を得る方法はありますか?

ありがとうございます。

+0

これは、 'sort'を使うと簡単になることが分かりました。何かが好きです: 'sort -u -k1,3 -k2,3'あなたが思うものを教えてください。 – Rish

+0

私はロジックが不足しています。なぜあなたは '1 345青色 'を保っていますが、予想される出力に' 3 342 green'を落としていますか? – jlliagre

+0

@jlliagre、申し訳ありません。修正されました。 – Rish

答えて

4

は、少なくとも例えば、それは同様に簡単です:あなたはそれを否定することができ、

$ awk 'arr[$1,$2,$4]++{next} 1' file 
1 345 a blue 
3 452 c blue 
3 342 d green 
1 345 f green 

または:

$ awk '!arr[$1,$2,$4]++' file 

また、速くなる可能性があると同じのためにGNUの並べ替えを使用することができます。

$ sort -k4,4 -k2,2 -k1,1 -u file 
+0

私のおかげで、私はこの質問をあまりにも重視しました。皆さん、ありがとうございました。 – Rish

4

@Rish:これも、試してみてください:

awk '!A[$1,$2,$4]++' Input_file 
+2

これは正解ですが、 'A []'ではなく、 'seen []'という名前を付ける前にインデックスが見えているかどうかをテストするために使用されている配列を持っているときは、いつもの理由で、変数名にbtwという大文字を使用しないでください.NR、FNRなどの変数名との衝突は避けてください。そうでない場合は、組み込みの変数名を使用しているように見えないようにしてください。 –

+1

励ましのためにAkshayありがとうございます。 Ed Mortonに感謝します。 – RavinderSingh13

+0

ありがとう@ RavinderSingh13!これは私の質問の元のループで使用した構文でした。何らかの理由で追加のフィールドを組み込むことに失敗しました...もう一度ありがとうございます。 – Rish

関連する問題