簡體   English   中英

使用Unix排序使用小數部分對pos / neg數進行排序

[英]Sorting pos/neg numbers with fractional parts using Unix sort

使用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)

您可以添加一個預處理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

我在Mac上,所以它可能是一個稍微不同的實現,但我發現這個工作:

sort -gb -k 4.5,4 inputfile

在英語中:“之類的 ,在一個-g ENERAL數字方式,忽略該列-b lanks,文件inputfile中使用第4 -k(c)中 olumn的數據,從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM