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

这是我合并两个文件,对它们进行排序,然后删除所有重复条目的方法:

  1. 我创建了一个临时文件夹并将两个文本文件都放在其中。
  2. 我运行以下命令来合并两个文件,但在两者之间保留换行符

    for file in *.txt; do
        cat $file >> output.txt
        echo >> output.txt
    done
    

生成的 output.txt 文件中有22243490行,大小为 207.5 Mb

现在,如果我按如下所示对其运行排序命令,我会收到一个错误,因为其中存在非 ASCII 字符(可能是 unicode、宽字符):

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 

但请注意 - 这可能会导致一些大文件大小出现问题,以千兆字节(或更大)计算,无论如何数百兆字节应该没问题。如果我想要真正的效率,例如拥有非常大的文件,我会首先删除单个文件的重复项,然后对其进行排序,一个接一个地合并,然后再次排序并再次删除重复的行。理论上 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 回答