我有一个巨大的文本文件(截至今天已有 40 GB),我想在不对文件进行排序的情况下过滤出唯一的行。该文件有 unix 行尾,并且所有内容都匹配 [[:...
我有一个非常大的文本文件(截至今天已有 40 GB),我想过滤出唯一的行 而不对 文件进行排序。
该文件具有 unix 行结尾,并且所有内容都匹配 [[:print:]]
。我尝试使用以下 awk 脚本仅显示唯一行:
awk 'a[$0] {next} 1' stupid.txt > less_stupid.txt
我的想法是,通过引用数组元素来填充数组,使用文件内容作为键,然后跳过数组中已有的行。但这失败了,原因有两个:首先,它莫名其妙地不起作用(即使在小型测试文件上也是如此);其次,因为我知道在 awk 将整组唯一行加载到内存中之前,我的系统将耗尽内存。
经过搜索,我发现 这个答案 推荐:
awk '!x[$0]++'
虽然这适用于小文件,但在读取整个文件之前它也会耗尽内存。
有什么更好的(即可行的)解决方案?我对任何事情都持开放态度,但我更偏爱用我熟悉的语言(bash 和 awk,因此有标签)提供的解决方案。在尝试可视化问题时,我想到最好的办法是存储行校验和或 MD5 数组,而不是行本身,但这只能节省一点空间,并且存在校验和冲突的风险。
任何提示都非常欢迎。告诉我这是不可能的,我也欢迎,这样我就不用再去想了。:-P