【问题标题】:Deduplicating lines in large file fails with sort and uniq大文件中的重复数据删除行因 sort 和 uniq 而失败
【发布时间】:2019-09-19 08:06:59
【问题描述】:

我有一个大文件,其中每行包含一行 JSON,共 1563888 行。为了对这个文件中的行进行重复数据删除,我一直在使用 shell one-liner sort myfile.json | uniq -u。

对于较小的文件,这种方法有效,sort myfile.json | uniq -u | wc -l 大于 0。由于文件大小现在运行 sort myfile.json | uniq -u | wc -l 会产生 0 行,而如果我使用 head -n500000 myfile.json | sort | uniq -u | wc -l 则有效。

bash 有没有一种简单的方法来处理如此大的文件?还是有一种干净的方法可以将文件分块?我最初使用 bash 而不是 Python,因为它似乎是一种更简单的快速验证事物的方法,但现在我正在考虑将这个任务移回 Python。

【问题讨论】:

  • 应该没问题。你确定你没有收到任何错误吗?是否有任何程序以非零状态退出?
  • Due to the file size produces 0 lines 不可能。这很难相信。它应该工作很长时间,或者至少应该抛出一个错误(很可能是“内存不足”)。顺便提一句。 sort -u 比 sort | uniq -u 更短(因此内存消耗更少)。

标签: bash sorting duplicates large-files


【解决方案1】:

按照 Kamil Cuk 的说法,让我们试试这个解决方案:

sort -u myfile.json 

文件真的是 JSON 吗?对 JSON 文件进行排序可能会导致可疑的结果。您也可以按照 Mark Setchell 的建议尝试拆分文件。然后,您可以对每个拆分文件进行排序,并对结果进行排序。所有的事情都应该用sort -u来完成。

如果 myfile.json 确实是 JSON 文件,请提供一些示例。让我们来看看你只使用sort -u时的结果。

【讨论】:

  • 该文件是 ja 子换行文件。 sort -u myfile.json 返回非零结果,而 sort myfile.json | uniq -u 返回 0 行。非常有趣的行为,我想知道为什么 sort -u 和 sort | uniq -u 在这里的行为如此不同。
猜你喜欢
  • 2012-09-22
  • 2020-11-25
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多