2010-03-16 55 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] 

和输出递减值的顺序进行了排序。