【问题标题】:GNU sort -u outputs binary charactersGNU sort -u 输出二进制字符
【发布时间】:2014-11-04 13:00:22
【问题描述】:

我正在尝试从一个非常大的文件(5 列,2,044,530,100 行,~49 GB)的列中获取所有唯一值。我目前的方法是剪切相关列并将其放入 sort -u (排序并仅输出唯一值)。虽然我的 INPUT 只是文本,但我的输出包含二进制字符并使其无法使用。

INPUT 的第一行如下所示:

1 D12 rs01 T T
1 D12 rs02 G G
1 D12 rs03 G G
1 D15 rs01 C C

通过 tr 命令并不能使它变得更好,它只是使二进制字符可见。

cut -d" " -f3 INPUT | sort -u > OUTPUT
cut -d" " -f3 INPUT | tr -cd '\11\12\15\40-\176' | sort -u > OUTPUT

例如,上面命令的一些示例输出:

yO+{(#6:1fr
    EvI0^?E0/':>)zj;<f#V&:oY\RM&mhR!6(qV%|`rJTq4IKqV{]Dzb"~8(X82
    F:7nc9gZ#nht^M">vo|F+g"x%r>UdF+Rn^MOu=

虽然预期的输出是一个值中包含所有唯一值的列,例如:

rs01
rs02
rs03
rs04
rs05

很遗憾,我无法使用生成的(较小的)数据复制此行为。有没有人建议如何处理这个问题?非常感谢所有帮助。排序版本是 sort (GNU coreutils) 8.4

【问题讨论】:

  • 我会先检查输出而不进行排序,以确保您的输入是纯文本,就像您认为的那样。
  • 您是否与strings 联系过,例如strings INPUT | cut ... ?
  • 这可能是sort 的内存溢出,因为sort 必须将整个数据保存到内存中才能工作...sort 中有一个-S 选项来设置缓冲区大小,你可以试试。
  • @EdouardThiel 这将取决于实现。例如,GNU sort 将为大型输入集使用临时文件,-S 选项控制在任何给定时间在内存中缓冲多少。
  • 仅保留可打印和控制字符是否有帮助:例如tr -cd '[:print:][:cntrl:]' 或者与您所做的相同?

标签: bash shell sorting unix gnu


【解决方案1】:

我不会手动拆分文件进行检查,而是尝试对输入文件进行 grep 处理以查找异常字符,以确保您的输入没有损坏,或者找到有垃圾的地方。

grep -b -E -v -e '^[[:alnum:][:space:]]+$' <your file>

如果输入正常,请尝试使用临时文件而不是管道,并以相同的方式检查它。如果没问题,怪sort.
(PS。我宁愿将其发布为评论,而不是解决方案,但我不能)

【讨论】:

  • 这确实给出了损坏的输出,确认输入文件一开始就不好。虽然不排除 sort -u 对超大文件做一些奇怪的事情,但似乎不太可能。
  • 编辑:除了“检查您的输入”之外,这个问题没有真正的答案。我认为您提供了一个非常有用的命令来检查一般输入,这肯定是对我而言解决方案的一部分。所以你去吧,我将此答案标记为解决方案。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2014-11-29
相关资源
最近更新 更多