使用Unix排序使用小数部分对pos / neg数进行排序

时间:2013-10-23 17:55:07

标签: linux sorting unix

使用sort (coreutils) 5.2.1

我有以下文件,我想按字段4的非整数部分排序。这可以是负数或正数,也可能具有值INF。

field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=INF field5 field6

我希望将其排序为

field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6

鉴于字段的数字部分位于字符位置4(假设索引从0开始,我不确定),我尝试使用以下选项sort

  • sort -g -k4.4 inputfile
  • sort -g -k4.5 inputfile
  • sort -n -k4.4 inputfile
  • sort -n -k4.5 inputfile
  • sort -g inputfile

这些都产生以下,这是接近但不太正确。大小的排序正确,但我想要最负面的值。

field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6

如何让sort表现出来?

FWIW,这里有更多信息:

LANG = en_US.UTF-8
Red Hat Enterprise Linux WS release 4 (Nahant Update 6)

2 个答案:

答案 0 :(得分:1)

您可以添加一个预处理awk步骤,该步骤在末尾添加一个包含数字部分或字段4中的数字表示的新字段,并按此字段排序。添加后处理步骤以去除此字段。请注意,在下面的示例中,INF已设置为10**10的任意高值,如果输入中的自然数字超过此值,则可以将其设置为更高的值< / p>

awk '{x=$4; sub("tag=", "", x); sub("INF", 10**10, x); print $0, x}' file.txt |
sort -k7,7g | 
cut -f-6 -d' '
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6

答案 1 :(得分:1)

我在Mac上,所以实现方式略有不同,但我发现这可行:

sort -gb -k 4.5,4 inputfile

英文:&#34; 排序,以 -g 通用数字方式,忽略 -b lanks,文件 inputfile 使用 4 -k(c) olumn的数据,来自 5 元素列到 4 列&#34;

中数据的末尾
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6