【发布时间】: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