フォルダにはすべて12個のテキストファイルがあり、各ファイルには約500万行があり、各ファイル自体に重複行はありませんが、複数のファイルに重複行があります。各ファイルから重複行を削除したいのですが、まだ保存中です。私は多くのLinuxソートコマンドを試しましたが、ファイルを継続的にマージします。私はWindows、Linus、Macを使用しています。これを実行できるコードやアプリケーションはありますか?
ベストアンサー1
すべての重複エントリを削除しますが、ファイル内の最初の重複エントリを保持し、他のファイルから削除するには、次のようにawkを使用できます。これにより、行の順序も維持されます。
awk '!seen[$0]++ { print >FILENAME".new" }' file1 file2 ... file12
これには最大12個のファイルがあるため、awkを介して開いているファイルを閉じる必要はありませんが、処理して完了した後でも各ファイルを閉じることができます。
awk '!seen[$0]++ {
if(prev!=FILENAME) close(prev".new");
print >FILENAME".new";
prev=FILENAME }
' file1 file2 ... file12
シェルと外部コマンドを使用して、出力mv
ファイルの名前を元の名前に変更できます。rename
コマンドも同様です。)
for file in ./*.new; do echo mv -v -- "$file" "${file%.new}"; done
注:echo
結果に満足したら削除してください。
GNU awkがある場合は、-i inplace
オプションを使用して次のようにファイルを変更し、コマンド全体を簡素化できます。
gawk -i inplace '!seen[$0]++' file1 file2 ... file12