2011-02-09 9 views
4

あるフィールドが重複している行を削除したい場合は、sort -u -k n、nを使用します。 しかし、これは1つのオカレンスを保持します。私が重複のすべての出現を取り除きたい場合は、これを行うためのクイックbashまたはawkの方法がありますか?重複する行がすべて削除される

例:私が持っている:

1 apple 30 
2 banana 21 
3 apple 9 
4 mango 2 

私が欲しい:。

2 banana 21 
4 mango 2 

私は事前ソートした後、perlではなく、Vのハッシュを使用する大容量のファイルこれが遅いことになるだろう。

答えて

2

sort -k <your fields> | awk '{print $3, $1, $2}' | uniq -f2 -u | awk '{print $2, $3, $1}'を試して、複製されたすべての行を削除してください(コピーを残さないでください)。最後のフィールドが必要ない場合は、最初のawkコマンドをcut -f 1-5 -d ' 'に変更し、をuniqに変更して-f1に変更し、2番目のawkコマンドを削除します。

+0

私はこの作品とは思わない、uniqのはとしてソート-u – annavt

+0

ない 'UNIQ -u'と同じように動作します。それは 'sort -u'とは違って、あなたが望むことをします。 –

+0

私に何か不足していますか? '$ sort〜/ Desktop/fruit.txt | awk '{プリント$ 3、$ 1、$ 2}' |ユニーク-f1 -u | awk '{print $ 2、$ 3、$ 1}' リンゴ1 2バナナ21 3リンゴ9 4マンゴ2 $ sort -k2,2〜/ Desktop/fruit.txt | awk '{プリント$ 3、$ 1、$ 2}' |ユニーク-f1 -u | awkは 1リンゴ '{$ 2、$ 3、$ 1を印刷}' 30 3リンゴ9 2バナナ21 4答えはバグがありました2 ' – annavt

3

これはあなたの入力と同じ順序であなたの出力を維持します:

awk '{seen[$2]++; a[++count]=$0; key[count]=$2} END {for (i=1;i<=count;i++) if (seen[key[i]] == 1) print a[i]}' inputfile 
+0

素晴らしい – annavt

関連する問題