关联数组我有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