Cygwin を使用して複数のファイルをマージしています。しかし、私のアプローチが正しいかどうかを知りたかったのです。これは質問と議論の両方です:)
まず、私が持っているファイルについての情報を少し:
- どちらのファイルにも、ASCII 文字と非 ASCII 文字が含まれています。
- File1 には7899097行あり、サイズは ~ 70.9 Mbです
- File2 には14344391行あり、サイズは ~ 136.6 Mbです
ファイルのエンコード情報:
$ file -bi file1.txt
text/x-c++; charset=unknown-8bit
$ file -bi file2.txt
text/x-c++; charset=utf-8
$ file -bi output.txt
text/x-c++; charset=unknown-8bit
これは、2 つのファイルをマージし、並べ替えてから、重複するエントリをすべて削除するための方法です。
- 一時フォルダーを作成し、その中に両方のテキスト ファイルを配置します。
次のコマンドを実行して両方のファイルをマージしますが、2 つのファイルの間に改行を入れます。
for file in *.txt; do cat $file >> output.txt echo >> output.txt done
結果の output.txt ファイルには22243490行が含まれ、サイズは 207.5 Mb になります。
ここで、以下に示すように並べ替えコマンドを実行すると、その中に非 ASCII 文字 (おそらくユニコード、ワイド文字) が存在するため、エラーが発生します。
sort -u output.txt
string comparison failed: Invalid or incomplete multibyte or wide character
そこで、環境変数LC_ALLを C に設定し、次のようにコマンドを実行します。
cat output.txt | sort -u | uniq >> result.txt
また、result.txt には22243488行あり、サイズは 207.5 Mb です。
したがって、result.txt は output.txt と同じです。
さて、output.txt に多くの重複エントリがあることは既にわかっていますが、上記のコマンドで重複エントリを削除できないのはなぜですか?
また、ファイルのサイズが大きいことを考慮して、これが複数のファイルをマージし、並べ替えてから一意にする効率的な方法であるかどうかを知りたいと思いましたか?