使用科学记数法和两列的Unix排序

lvjbypge  于 2023-02-04  发布在  Unix
关注(0)|答案(1)|浏览(185)

我对使用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。

zphenhs4

zphenhs41#

我在写堆栈问题时就想到了这个问题,所以我想我应该继续写,并将问题和我的解决方案一起发布。
我对-kn,n的含义感到困惑,实际上使用带有--debug标志的sort帮助我找到了答案。
This question基本上把它钉在了头上:始终使用-kX,X来确保一次只考虑一个字段,然后在数值字段中指定g。

sort -k1,1 -k2,2g test
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

耶!

相关问题