我尝试简化标题,如果造成一些混淆,请谅解。
我有一个大型文本文件(文件 A)(大约 13GB),我想对其进行排序(放入文件 B)以删除重复的行。问题是我的空间有限,所以我无法创建一个大小差不多的文件。有没有办法主动删除从文件 A 排序的行?
我的排序代码:awk ' !x[$0]++' FileA.lst > FileB.lst
答案1
简单答案:连续重复的行
对于现场编辑,sed
是首选工具。要删除连续的重复行,请使用以下命令:
sed '$!N; /^\(.*\)\n\1$/!P; D'
没那么简单:非连续的重复行
如果重复的行不连续,您可以使用这个 - 但存在缓冲区空间溢出的风险:
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
因为sort
使用合并排序算法(假设 GNUsort
通常在 Linux 上使用),因此仍然存在内存或磁盘耗尽的风险,因为合并排序在最坏情况下会使用大量辅助空间。除了这个风险之外,@thom 的建议是正确的sort -u
。
如果问题是删除不连续的重复行,并且存在由于最坏情况而导致空间不足的风险sed
,那么sort
最好的解决方案可能是将文件移动到某种外部存储器,例如 USB 闪存驱动器。
请注意,如果你不知道无论sed
是否sort
可能会耗尽空间并损坏文件,您都确实需要以某种方式备份文件。另一个解决方案可能是在文件系统中查找可以压缩的大文件,并将足够多的文件压缩为单独的文件,以便安全地执行压缩awk '!x[$0]++' inFile > outFile
。sort -u
这样,如果命令失败,您就不会丢失数据。
另请参阅“有用的单行脚本sed
”:http://sed.sourceforge.net/sed1line.txt
答案2
据我所知,该程序 sort
可以进行“就地”排序,这意味着您可以使用同一个文件进行输入和输出。sort -u
将删除重复的行。
命令如下:
sort -u mylargefile mylargefile
当然,在开始实际操作之前,最好先在较小的测试文件上进行测试。特别是如果你没有那个 13 GB 文件的备份