2017-05-15 24 views
0

私は、CSVファイルの束を持つディレクトリを持つファイルから重複行を削除します。すべてのファイルから重複した行を削除したい。は、再帰的に

私はawkのソリューションを試みたが、それぞれ、すべてのファイルのためにそれを行うには少し退屈であるように思われています。私は、ファイル名を失っただろう awk '!x[$0]++' *

を行います場合でも

awk '!x[$0]++' file.csv

。 1つのコマンドまたはスクリプトを使用してすべてのファイルから重複を削除する方法はありますか?ただ、3つのファイルがディレクトリに存在する場合、出力は3つのファイル、個別にソートされた各が含まれている必要があり を明確にする

。コマンドまたはスクリプトを実行した後、同じフォルダにはそれぞれ固有のエントリを持つ3つのファイルが含まれている必要があります。

+0

あなたは場所にファイルを変更するか、新しいファイルを作成したいですか? – RomanPerekhrest

答えて

0
for f in dir/*; 
do awk '!a[$0]++' "$f" > "$f.uniq"; 
done 

既存のファイルを上書きするには、テスト後にawk '!a[$0]++' "$f" > "$f.uniq" && mv "$f.uniq" "$f"に変更してください。

0

これが唯一のユニークなラインを持っているサフィックス.newで新しいファイルを、作成します。

gawk '!x[$0]++{print>(FILENAME".new")}' *.csv 

を、それが

  • !x[$0]++

    はこれが条件である仕組み。それが真の現在の行だけ、$0に評価され、前に見ていません。

  • print >(FILENAME".new")

    条件が真と評価された場合は、このprint文が実行されます。現在の行を、現在のファイルの名前である名前がFILENAMEで、その後に文字列.newが続くファイルに書き込みます。 GNU AWKで

+0

出力リダイレクションの右側の括弧で囲まれていない式は、使用しているawkのバージョンに応じて、POSIX、つまりYMMVごとに未定義の動作です。代わりに 'print> FILENAME" .new "を使用してください。また、入力ファイルがたくさんある場合は、出力ファイルを閉じるか、いくつかのawkから「開いているファイルが多すぎます」というエラーが表示されます。または、これはgawk固有であり、それについては心配しないでください:-)。 –

+1

@エドモートン良い点。回答が更新されました。 – John1024

0

「インプレース」編集や出力ファイルの自動オープン/クローズ管理のために:

awk -i inplace '!seen[FILENAME,$0]++' *.csv