1

Cygwin を使用して複数のファイルをマージしています。しかし、私のアプローチが正しいかどうかを知りたかったのです。これは質問と議論の両方です:)

まず、私が持っているファイルについての情報を少し:

  1. どちらのファイルにも、ASCII 文字と非 ASCII 文字が含まれています。
  2. File1 には7899097行あり、サイズは ~ 70.9 Mbです
  3. 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 つのファイルをマージし、並べ替えてから、重複するエントリをすべて削除するための方法です。

  1. 一時フォルダーを作成し、その中に両方のテキスト ファイルを配置します。
  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 に多くの重複エントリがあることは既にわかっていますが、上記のコマンドで重複エントリを削除できないのはなぜですか?

また、ファイルのサイズが大きいことを考慮して、これが複数のファイルをマージし、並べ替えてから一意にする効率的な方法であるかどうかを知りたいと思いましたか?

4

1 に答える 1

1

うーん、私は使用します

cat file1.txt file2.txt other-files.* | recode enc1..enc2 | sort | uniq > file3.txt 

ただし、注意してください。これにより、ギガバイト(またはそれ以上)でカウントされるいくつかの大きなファイルサイズで問題が発生する可能性があります。とにかく、数百メガバイトでも問題ないはずです。非常に大きなファイルがある場合など、実際の効率が必要な場合は、最初に単一ファイルの重複を削除し、次にそれを並べ替え、1つずつマージしてから、もう一度並べ替えて重複行を再度削除します。理論的には、uniq-cおよびgrepフィルターは重複を削除できます。ソリューションの不必要な洗練に陥らないようにしてください:)

http://catb.org/~esr/writings/unix-koans/two_paths.html

編集:

mv file1.txt file1_iso1234.txt 
mv file2.txt file2_latin7.txt
ls file*.txt |while read line; do cat $line |recode $(echo $line|cut -d'_' -f2 |cut -d'.' -f1)..utf8 ; done | sort | uniq > finalfile.txt
于 2012-07-22T06:40:34.110 に答える