使用Unixsorting将pos / neg数字与小数部分分开

使用sort (coreutils) 5.2.1

我有以下文件,我想按字段4的非整数部分进行sorting。这可能是一个负数或正数,也可能具有值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 

我想这是sorting为

 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

这些都产生了以下结果,这是接近的,但不完全正确。 大小sorting正确,但我想最上面的负面价值。

 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

在英文中:“用数字方式排序 ,忽略-b lanks,使用第4 -k(c)列数据的文件输入文件,从该列中的第5个元素到数据结尾第四列“

 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