Linux Bash 的 sort 命令产生意外结果

Linux Bash 的 sort 命令产生意外结果

我有一个文件 foo.txt,其内容如下:

chr1    15
chr11   5
chr11   8
chr1    7
chr2    23
chr1    35

我尝试先根据第一列进行排序,然后根据第二列进行排序,在 Linux Shell 中使用以下命令:

sort -k 1,1 -k 2,2n foo.txt

但结果很奇怪:

chr1    7
chr1    15
chr11   5
chr11   8
chr1    35
chr2    23

我预期的是这样的:

chr1    7
chr1    15
chr1    35
chr11   5
chr11   8
chr2    23

编辑 我按照评论中的建议检查了文件中的字符od -fc foo.txt,没有奇怪的字符。结果如下:

0000000   3.5274972e-09   8.7240555e-33   3.5274972e-09    8.716562e-33
          c   h   r   1  \t   1   5  \n   c   h   r   1   1  \t   5  \n
0000020   3.5274972e-09   8.8610065e-33   3.5274972e-09   2.5496164e+21
          c   h   r   1   1  \t   8  \n   c   h   r   1  \t   7  \n   c
0000040   2.1479764e-33   2.5493397e+21   2.1359394e-33     9.37439e-40
          h   r   2  \t   2   3  \n   c   h   r   1  \t   3   5  \n
0000057

我正在使用sort (GNU coreutils) 8.21 有什么想法吗?

答案1

看来问题出在您的语言环境的排序偏好上。您可以在您的环境中指定它,然后任何使用它的命令(包括sort)都会遵循它:

export LC_COLLATE=C
sort -k 1,1 -k 2,2n foo.txt

或者您可以仅为排序本身的持续时间指定该值

LC_COLLATE=C sort -k 1,1 -k 2,2n foo.txt       # or
env LC_COLLATE=C sort -k 1,1 -k 2,2n foo.txt

相关内容