将 FileA 排序到 FileB 中,同时主动从 FileA 中删除行

将 FileA 排序到 FileB 中,同时主动从 FileA 中删除行

我尝试简化标题,如果造成一些混淆,请谅解。

我有一个大型文本文件(文件 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 > outFilesort -u这样,如果命令失败,您就不会丢失数据。

另请参阅“有用的单行脚本sed”:http://sed.sourceforge.net/sed1line.txt

答案2

据我所知,该程序 sort可以进行“就地”排序,这意味着您可以使用同一个文件进行输入和输出。sort -u将删除重复的行。

命令如下:

sort -u mylargefile mylargefile

当然,在开始实际操作之前,最好先在较小的测试文件上进行测试。特别是如果你没有那个 13 GB 文件的备份

相关内容