awk4.0对数组value排序
有朋友问了一个问题,要求对下面这段文本进行处理:
http://www.baidu.com/2.html http://www.baidu.com/2.html http://www.baidu.com/2.html http://www.baidu.com/2.html http://www.baidu.com/2.html http://www.163.com/index.html http://www.163.com/1.html http://www.163.com/index.html http://www.sina.com.cn/index.html http://www.sina.com.cn/3.html http://www.sina.com.cn/2.html http://www.sina.com.cn/2.html
输出结果:
www.163.com 3 www.sina.com.cn 4 www.baidu.com 5
要求对输出的第2列进行升序排序。awk4.0以下版本直接用内置的排序函数asort、asorti貌似没有办法做出来。简单的办法就是交给shell来排序:
awk -F/+ '{a[$2]++}END{for(i in a)print i,a[i]|"sort -k2n"}' file www.163.com 3 www.sina.com.cn 4 www.baidu.com 5
如果一定要用纯awk来做,方法如下,awk版本需要4.0+。
awk -F/+ 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}{a[$2]++}END{for(i in a){print i,a[i]}}' file www.163.com 3 www.sina.com.cn 4 www.baidu.com 5
降序:
awk -F/+ 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"}{a[$2]++}END{for(i in a){print i,a[i]}}' file www.baidu.com 5 www.sina.com.cn 4 www.163.com 3
PROCINFO["sorted_in"]还有@unsorted、@ind_str_asc、@ind_num_asc、@val_type_asc、@val_str_asc、@ind_str_desc。。。。等特殊值可用,具体用法可以参考https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html。