私は現在、csvファイルを処理するスクリプトに取り組んでいます。そのスクリプトの1つは、ファイル内の重複行を削除してメモすることです。これを行う現在の方法は、uniq -dを1回使用してuniqを1回実行してすべての重複を表示してから、実際に重複を削除するオプションなしでもう一度uniqを実行することです。そうは言っても、uniqを2回実行する代わりに、これと同じ機能を1つのアクションで実行できるのではないかと思いました。awkを使用して重複を削除するさまざまな例を見つけましたが、私が知る限り、重複を表示して同時に削除したものは見つかりませんでした。誰かがこれについてアドバイスや助けを提供することができれば、私は本当に感謝します、ありがとう!
質問する
2210 次
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-1
i == 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
tee
cat
コマンドの出力を に送信しますuniq -d
。
于 2012-11-29T19:50:34.950 に答える