我已经在互联网和 stackexchange 上搜索过这个。尽管有很多类似的主题,但我还没有找到解决方案。
因此,我有一个相当大的列表(大约 20GB),其中包含大约 5% 的重复行。我想过滤此列表,以便删除其中一个重复项。例子:
输入:
test123
Test123
test
test123
test 123
输出:
test123
Test123
test
test 123
列表是否排序并不重要。
我sort -u -o output.txt
也尝试过sort -us -o output.txt
。它适用于较小的文件,但是当我尝试处理超过大约的文件时。 4GB,生成的文件小得可疑,而且它不是 .txt 文件,而是显然变成了“emacs-lisp-source-text”。
如果有人能帮助我,我将非常感激!
答案1
使用 GNU coreutils 8.26 中的 GNU 进行测试sort
,我对 5GiB 文件进行排序没有问题。所以,你可以尝试安装那个。
但要记住的事情:
sort -u
不会为您提供独特的行,而是排序相同的所有行之一。特别是在 GNU 系统上,以及在您的典型语言环境中,有几个字符的排序相同。如果您想要字节级别的唯一行,请使用LC_ALL=C sort -u
.sort
对大输入使用临时文件来分块排序,以免耗尽整个内存。如果你的临时目录没有足够的空间(通常/tmp
除非你设置了$TMPDIR
),那么它将失败。设置$TMPDIR
(另请参阅-T
GNU 选项sort
)为具有足够可用空间的目录。
答案2
printf "">输出文件 cat 输入文件 | 而 IFS= 读取 -r 行;做 如果 [ ! -z“$行”];然后 如果 ! grep -Fxqe "$line" 输出文件;然后 echo "$line">>输出文件; 菲 菲 完毕
解释
创建一个新的输出文件
printf "">OutputFile
将 InputFile 通过管道传送到 while 循环
cat InputFile |
读取每一行
while IFS= read -r line; do
处理空行
if [ ! -z "$line" ]; then
检查该行是否已在 OutputFile 中
如果结果为空,则它尚未在 OutputFile 中(即,它是唯一的)
if ! grep -Fxqe "$line" OutputFile; then
将行放入输出文件中
echo "$line">>OutputFile;