我正在使用Cygwin合并多个文件。然而,我想知道我的方法是否正确。这既是一个问题,也是一个讨论:)
首先,关于我拥有的文件的一些信息:
文件编码信息:
$ 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这是我所遵循的合并两个文件的方法,对它们进行排序,然后删除所有重复的条目:
生成的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中有许多重复的条目,那么为什么上面的命令不能删除重复的条目呢?
另外,考虑到这些文件的大小,我想知道这是否是一种合并多个文件、对它们进行排序然后进行唯一处理的有效方法?
发布于 2012-07-22 06:40:34
嗯,我会用
cat file1.txt file2.txt other-files.* | recode enc1..enc2 | sort | uniq > file3.txt 但是要小心--这可能会导致一些大的文件大小的问题,包括千兆字节(或更大的),无论如何,几百兆字节的文件可能就没问题了。如果我想要真正的效率,例如有非常大的文件,我首先删除单个文件副本,然后排序,合并一个一个,然后再排序,再删除重复行。理论上,uniq,-c和grep滤波器可以去除重复。尽量避免陷入解决方案中不必要的复杂程度:)
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.txthttps://stackoverflow.com/questions/11598002
复制相似问题