使用 Unix 排序对带有小数部分的 pos/neg 数字进行排序



Using 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)

我在Mac上,所以它可能是一个稍微不同的实现,但我发现这是有效的:

sort -gb -k 4.5,4 inputfile

英语:"排序,以 -g能量数字方式,忽略 -blanks,使用 4 th -k(c)olum 的数据的文件输入文件,从该列的第 5个元素到第 4列中的数据末尾"

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

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

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

最新更新