GNU sort -u输出二进制字符

时间:2014-11-04 13:00:23

标签: bash shell sorting unix gnu

我试图从一个非常大的文件中的列中获取所有唯一值(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

1 个答案:

答案 0 :(得分:1)

我不会手动拆分文件进行检查,而是尝试在输入文件中查找不常见的字符,只是为了确保输入没有损坏,或者找到垃圾的地方。

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

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