2010-03-16 70 views
16

關聯數組我有AWK關聯數組被填充像這樣:排序在AWK

chr_count[$3]++ 

當我嘗試打印我的chr_counts,我用這個:

for (i in chr_count) { 
    print i,":",chr_count[i]; 
} 

但不令人驚訝的是,我的排序並沒有以任何方式排序。 有沒有一種簡單的方法來遍歷chr_count的排序鍵?

+2

請參閱http://stackoverflow.com/a/5345056/69663 - 如果您有gawk 4,PROCINFO [「sorted_in」] =「@val_num_asc」等等都非​​常簡單易用。如果您想要按降序/升序,按值/鍵,數字/字符串,您自己的功能等,該手冊顯示了很多不同的選項:https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning – unhammer 2016-05-12 17:54:56

回答

22

相反ASORT的,使用asorti(source, destination)其中指數排序進入一個新的數組,你不會有數組複製。

然後,您可以使用目標數組作爲指向源數組的指針。

對於你的榜樣,你會使用這樣的:

n=asorti(chr_count, sorted) 
for (i=1; i<=n; i++) { 
     print sorted[i] " : " chr_count[sorted[i]] 
} 
+0

哇,儘管在文檔中閱讀過它,但完全忘記了這一點。這絕對是更好的答案。 – Cascabel 2010-03-16 22:00:12

+0

+1輝煌! – 2013-06-21 13:56:17

+1

'asorti'不適用於nawk-20121220-2.fc20.x86_64。 – 2014-08-01 14:11:29

4

這是直接取自the documentation

populate the array data 
# copy indices 
j = 1 
for (i in data) { 
    ind[j] = i # index value becomes element value 
    j++ 
} 
n = asort(ind) # index values are now sorted 
for (i = 1; i <= n; i++) { 
    do something with ind[i]   Work with sorted indices directly 
    ... 
    do something with data[ind[i]]  Access original array via sorted indices 
} 
+0

注意,這個解決方案是有缺陷的,因爲這最終會失去在原始數組中具有相同值的密鑰。從其他線程接受的解決方案有一個想法如何解決方法:http://stackoverflow.com/a/5345056/95750 – haridsv 2015-11-30 06:12:52

+1

@haridsv不,我不這麼認爲。這個問題是關於按鍵排序的,而不是數值,同一個鍵不能有兩個值,所以這裏沒有問題。你指出的另一個問題是關於通過值進行排序(實際上可能並非所有的都是不同的),所以如果你試圖使用這個代碼,那會是一個問題。但是,如果您將它用於所寫的內容,這並不是有缺陷的。 – Cascabel 2015-11-30 06:26:45

+0

道歉..我誤讀索引代碼爲「翻轉」鍵/值,但重讀後,我注意到你正在使用一個不斷增加的數字作爲索引,而不是原始值。感謝您回覆並澄清它。 – haridsv 2015-11-30 06:42:58

6

注意asort()asorti()是針對呆子,和未知的AWK。對於簡單的awk,你可以推出你自己的sort()或從其他地方購買。

11

您可以使用排序命令。例如

for (i in data) 
print i ":", data[i] | "sort" 
0

我最近遇到這個問題,發現用gawk我可以設置值PROCINFO["sorted_in"]來控制迭代次序。我發現這個有效值的列表,通過搜索PROCINFO在線登陸該GNUAwk用戶指南頁面:https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

此列出形式@{key|val}_{num|type|str}_{asc|desc}的選項有:

  • key通過鍵和val排序按價值排序。
  • num按數字排序,str按字符串排列,type按指定類型排序。
  • asc升序和desc降序排列。

我只是用:

PROCINFO["sorted_in"] = "@val_num_desc" 
for (i in map) print i, map[i] 

和輸出遞減值的順序進行了排序。