我有一个文件 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