我试图从一个非常大的文件中的列中获取所有唯一值(5列,2,044,530,100行,~49 GB)。我目前的方法是剪切相关列并通过排序-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
答案 0 :(得分:1)
我不会手动拆分文件进行检查,而是尝试在输入文件中查找不常见的字符,只是为了确保输入没有损坏,或者找到垃圾的地方。
grep -b -E -v -e '^[[:alnum:][:space:]]+$' <your file>
如果输入正常,请尝试使用临时文件而不是管道,并以相同方式检查它。如果没关系,请责怪sort
(PS。我宁愿发布它作为评论,而不是解决方案,但我不能)