2013-10-23 48 views
5

使用sort (coreutils) 5.2.1排序POS /使用Unix的小數部分排序

我有以下文件,我想通過場4的非整數部分進行排序,其這可以是負的或正數NEG數字,也可能具有值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) 
+0

我得到了同樣的結果。它按照預期的方式排除了'tag =',並在第一個字段中排序,但不在其他任何帶有'tag ='的字段中排序。 – Kevin

回答

1

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

sort -gb -k 4.5,4 inputfile

英文:「排序,在-g ENERAL數字時尚,忽略個-b lanks,使用第-k(C) olumn的數據的文件inputfile中,從在該列中的數據的在列末尾的 th元素「

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 
+0

事實上'sort -gb -k4.5 inputfile'工作正常......刪除'-b'選項會將它恢復到上面顯示的錯誤排序。看着'man sort','-b'被列爲「忽略前導空白」。我不確定爲什麼這對我們有幫助,但我喜歡結果。 –

+0

另外,你能解釋一下'-k4.5,4'的用途是什麼?就我所瞭解的關鍵選項而言,這意味着從第四場的第五個角色開始,並停在第四場的開始。 –

+0

幾乎是正確的,這意味着停在字段4的*結尾處 –

1

您可以通過此增加一個預處理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