maa*_*maa 2 command-line sort text-processing uniq 18.04
我有 10 个文本文件,每行包含 65 个十六进制值字符。每个文本文件大小为 6.5GB(有 99999999 行)
IEfile1-6.5GB, file2-6.5GB, file3-6.5GB, file4-6.5GB, ... file10-6.5GB
我需要在所有这 10 个文本文件中找到重复行,并且我需要能够知道哪个重复行来自哪个文件以及有多少个文件有重复行?
我怎样才能做到这一点?
我目前正在使用这个命令:
sort *.txt | uniq -d > dup
Run Code Online (Sandbox Code Playgroud)
但它挂起,有时甚至崩溃。如果我想检查 65GB 的文件,我的计算机内存是否需要双倍大小,即是否需要安装更多内存?
还有其他方法可以做到这一点吗?
假设GNU 排序
sort不需要更多甚至等于处理文件大小的 RAM,它在处理过程中使用可用内存和临时文件对大文件进行批量排序。它非常高效,并且在直接从文件读取时不需要用户干预。但是,当从管道或 STDIN 读取时,--buffer-size=SIZE可能需要使用选项设置缓冲区大小的值以提高效率。
因此,您最可能需要的是足够的磁盘空间,可以在/tmp...下自由利用。如果磁盘空间不够,您可以尝试选项--compress-program=PROG(是PROG要使用的压缩程序,例如gzip。您需要指定它,并且需要要安装在您的系统上)在排序过程中压缩和解压缩临时文件,如下所示:
sort --compress-program=gzip *.txt | uniq -d > dupfile
Run Code Online (Sandbox Code Playgroud)
崩溃很可能是由于并行使用的处理线程/进程多于系统一次可以处理的数量。--parallel=N您可以使用选项来限制它以减少系统负载(可以是从到 的N数字。数字越小,处理速度越慢,但系统负载也会降低并且崩溃将停止),18如下所示:
sort --parallel=2 *.txt | uniq -d > dupfile
Run Code Online (Sandbox Code Playgroud)
这两个选项也可以一起使用,如下所示:
sort --compress-program=gzip --parallel=2 *.txt | uniq -d > dupfile
Run Code Online (Sandbox Code Playgroud)
或者,您可以先分两步进行,将文件逐一预排序,然后使用--merge已排序文件上的选项来合并文件而不进行排序,如下所示:
sort --merge *.txt | uniq -d > dupfile
Run Code Online (Sandbox Code Playgroud)
当然,您可以对预先排序的文件使用所有三个选项来减少系统的负载,如下所示:
sort --compress-program=gzip --parallel=2 --merge *.txt | uniq -d > dupfile
Run Code Online (Sandbox Code Playgroud)
要知道哪些重复行来自哪个文件,您可以使用grep将-F整行视为固定字符串的选项,并且应该为您提供更多性能以及-x将完全匹配整行的选项,如下所示:
grep -Fx -f dupfile *.txt > resultfile
Run Code Online (Sandbox Code Playgroud)