關聯數組我有AWK關聯數組被填充像這樣:排序在AWK
chr_count[$3]++
當我嘗試打印我的chr_counts
,我用這個:
for (i in chr_count) {
print i,":",chr_count[i];
}
但不令人驚訝的是,我的排序並沒有以任何方式排序。 有沒有一種簡單的方法來遍歷chr_count
的排序鍵?
關聯數組我有AWK關聯數組被填充像這樣:排序在AWK
chr_count[$3]++
當我嘗試打印我的chr_counts
,我用這個:
for (i in chr_count) {
print i,":",chr_count[i];
}
但不令人驚訝的是,我的排序並沒有以任何方式排序。 有沒有一種簡單的方法來遍歷chr_count
的排序鍵?
相反ASORT的,使用asorti(source, destination)
其中指數排序進入一個新的數組,你不會有數組複製。
然後,您可以使用目標數組作爲指向源數組的指針。
對於你的榜樣,你會使用這樣的:
n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
print sorted[i] " : " chr_count[sorted[i]]
}
哇,儘管在文檔中閱讀過它,但完全忘記了這一點。這絕對是更好的答案。 – Cascabel 2010-03-16 22:00:12
+1輝煌! – 2013-06-21 13:56:17
'asorti'不適用於nawk-20121220-2.fc20.x86_64。 – 2014-08-01 14:11:29
這是直接取自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
}
注意,這個解決方案是有缺陷的,因爲這最終會失去在原始數組中具有相同值的密鑰。從其他線程接受的解決方案有一個想法如何解決方法:http://stackoverflow.com/a/5345056/95750 – haridsv 2015-11-30 06:12:52
@haridsv不,我不這麼認爲。這個問題是關於按鍵排序的,而不是數值,同一個鍵不能有兩個值,所以這裏沒有問題。你指出的另一個問題是關於通過值進行排序(實際上可能並非所有的都是不同的),所以如果你試圖使用這個代碼,那會是一個問題。但是,如果您將它用於所寫的內容,這並不是有缺陷的。 – Cascabel 2015-11-30 06:26:45
道歉..我誤讀索引代碼爲「翻轉」鍵/值,但重讀後,我注意到你正在使用一個不斷增加的數字作爲索引,而不是原始值。感謝您回覆並澄清它。 – haridsv 2015-11-30 06:42:58
注意asort()
和asorti()
是針對呆子,和未知的AWK。對於簡單的awk,你可以推出你自己的sort()
或從其他地方購買。
您可以使用排序命令。例如
for (i in data)
print i ":", data[i] | "sort"
我最近遇到這個問題,發現用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]
和輸出遞減值的順序進行了排序。
請參閱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