2010-06-21 37 views
2

我有以下與GAWK的asorti功能問題:AWK/GAWK asorti()的問題

gawk 'BEGIN{ \ 

    a[1]=6; \ 

    a[2]=7; \ 

    a[3]=8; \ 

    a[21]=9; \ 

    a[123]=10; \ 

    t=asorti(a, o); \ 

    for (i=1; i<=t; i++) { \ 

    print i,o[i]; \ 

    } \ 

}' 

結果是:

1 1 

2 123 

3 2 

4 21 

5 3 

所以這是很清楚的awk,在字典順序排序指數,但awk的醫生說(ASORT(S [,d])):

「s的內容是使用gawk的一般規則是比較值進行排序......」

然而,當我複製指數本身到臨時數組,那種新的使用數組ASORT(),

它似乎確定(使用類似):

j=1; for(e in a) { temp[j++] = e; } 

上午我DOIN- IT-WRONG,還是gawk的asorti()有問題?

+0

你的awk腳本是單引號括起來,所以你不需要反斜線。 – 2010-06-21 19:08:35

回答

3

按照gawk manual:「關於陣列最重要的一個方面是,數組下標總是字符串。」

+0

謝謝!我錯過了。 – GiM 2010-06-22 17:46:03

0

正如你可以使用這樣的事情(你可能需要調整填充)一種解決方法:

gawk 'BEGIN { 
    a[1] = 6; a[2] = 7; a[3] = 8; a[21] = 9; a[123] = 10; 
    for (i in a) io[sprintf("%15s", i)] = a[i] 
    t = asorti(io, o) 
    for (i = 0; ++i <= t;) print i, o[i] + 0 
    }' 

用了GNU AWK,你甚至可以保留原來的鍵/索引:

WHINY_USERS=oops gawk 'BEGIN { 
    a[1]=6; a[2]=7; a[3]=8; a[21]=9; a[123]=10; 
    for (i in a) o[sprintf("%15s", i)] = a[i] 
    for (i in o) print i + 0, o[i] 
    }' 
2

我知道有關於GAWK 3的限制,但在GAWK 4(至少在4.1.1)是微不足道:

t=asorti(a, o, "@ind_num_asc"); 
+0

有用的提示,謝謝! – GiM 2015-05-02 12:19:55

+0

你拯救了我的整個人生!沒有注意到asorti的第三個論點。謝謝。 – 2015-08-15 06:18:21