1

私は現在、csvファイルを処理するスクリプトに取り組んでいます。そのスクリプトの1つは、ファイル内の重複行を削除してメモすることです。これを行う現在の方法は、uniq -dを1回使用してuniqを1回実行してすべての重複を表示してから、実際に重複を削除するオプションなしでもう一度uniqを実行することです。そうは言っても、uniqを2回実行する代わりに、これと同じ機能を1つのアクションで実行できるのではないかと思いました。awkを使用して重複を削除するさまざまな例を見つけましたが、私が知る限り、重複を表示して同時に削除したものは見つかりませんでした。誰かがこれについてアドバイスや助けを提供することができれば、私は本当に感謝します、ありがとう!

4

3 に答える 3

5

これがあなたが始めるための何かです:

awk 'seen[$0]++{print|"cat>&2";next}1' file > tmp && mv tmp file

上記は、入力ファイルからそれらを削除すると同時に、重複した行をstderrに出力します。もっと必要な場合は、もっと教えてください。

于 2012-11-29T19:30:45.200 に答える
1

一般的に、入力したサイズが目安となります。何 GB ものデータを処理している場合、多くの場合、これらのツールは外部操作をサポートしているため、sortおよびに依存する以外に選択肢はありません。uniq

つまり、AWK の方法は次のとおりです。

  • 入力がソートされている場合、重複がある場合は、O(1)状態の行iを行ごとに比較することで、AWK で重複したアイテムを簡単に追跡できます。i-1i == i-1

  • 入力がソートされていない場合は、すべての行を追跡する必要があり、 O(c)状態が必要です。ここで、cは一意の行の数です。この目的のために、AWK のハッシュ テーブルを使用できます。

于 2012-11-29T19:27:28.730 に答える
0

このソリューションは使用しませんawkが、必要な結果を生成します。以下のコマンドで、sortedfile.txt を csv ファイルに置き換えます。

cat sortedfile.txt | tee >(uniq -d > duplicates_only.txt) | uniq > unique.txt

teecatコマンドの出力を に送信しますuniq -d

于 2012-11-29T19:50:34.950 に答える