我对使用unix sort对两列进行排序的结果感到困惑。
下面是一个名为test的文件中的一些虚拟数据:
A 2e-12
A 3e-14
A 1e-15
A 1.2e-13
B 1e-13
B 1e-14
C 4e-12
C 3e-12
我想先按第1列排序,然后按第2列排序,以生成:
A 1e-15
A 3e-14
A 1.2e-13
A 2e-12
B 1e-14
B 1e-13
C 3e-12
C 4e-12
如果我只给予它第二列作为排序依据,它将正确地对科学记数法进行排序:
sort -g -k2 test
A 1e-15
B 1e-14
A 3e-14
B 1e-13
A 1.2e-13
A 2e-12
C 3e-12
C 4e-12
This stack question解决了一个类似的问题,但是我的测试似乎只在我要求按两列进行排序时才失败。
This other example看起来非常接近我想要的结果,但是当我单独给予-k时,它不会改变测试集的行为。
这些试验:
sort -k1,1 -g test
sort -k1,1 -g -k1,2 test
sort -k1,1 -g -k2,1 test
生产:
A 1.2e-13
A 1e-15
A 2e-12
A 3e-14
B 1e-13
B 1e-14
C 3e-12
C 4e-12
这些试验:
sort -g -k2 -k1 test
sort -g -k2 -k1,1 test
sort -g -k2,2 -k1,1 test
sort -k1,1 -g -k2,2 test
sort -k1,1 -g -k2,2 test
生产:
A 1e-15
B 1e-14
A 3e-14
B 1e-13
A 1.2e-13
A 2e-12
C 3e-12
C 4e-12
我已经用LANG=C和LC_ALL=C测试过了,但运气不好。我在Red Hat上运行这个程序,版本是GNU coreutils 8.22。
1条答案
按热度按时间zphenhs41#
我在写堆栈问题时就想到了这个问题,所以我想我应该继续写,并将问题和我的解决方案一起发布。
我对-kn,n的含义感到困惑,实际上使用带有--debug标志的sort帮助我找到了答案。
This question基本上把它钉在了头上:始终使用-kX,X来确保一次只考虑一个字段,然后在数值字段中指定g。
耶!