Arrays 如何对数组元素排序?
我有一份档案Arrays 如何对数组元素排序?,arrays,sorting,awk,Arrays,Sorting,Awk,我有一份档案 2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET / HTTP/1.1" 200 44 2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET /favicon.ico HTTP/1.1" 2$ 2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET / HTTP/1.1" 200 44
2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET / HTTP/1.1" 200 44
2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET /favicon.ico HTTP/1.1" 2$
2001:778:0:1::21 - - [16/Sep/2011:12:30:46 +0300] "GET / HTTP/1.1" 200 44
2001:778:0:1::21 - - [16/Sep/2011:12:32:15 +0300] "GET / HTTP/1.1" 200 66643
88.222.10.7 - - [17/Sep/2011:23:39:25 +0300] "GET / HTTP/1.1" 200 66643
88.222.10.1 - - [17/Sep/2011:23:39:25 +0300] "GET /favicon.ico HTTP/1.1" 200 14$
88.222.10.1 - - [17/Sep/2011:23:39:25 +0300] "GET /favicon.ico HTTP/1.1" 200 14$
88.222.10.1 - - [17/Sep/2011:23:39:25 +0300] "GET /favicon.ico HTTP/1.1" 200 14$
88.222.10.7 - - [18/Sep/2011:13:45:39 +0300] "GET / HTTP/1.1" 304 -
我需要数一数重复的IP地址
awk -F "- -" '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' myFile
所以现在我有了
2001:778:0:1::21 4
88.222.10.7 2
88.222.10.1 3
我想把所有的东西都分类,这样我的结果应该是
2001:778:0:1::21 4
88.222.10.1 3
88.222.10.7 2
但我不知道如何排序数组?有可能做到这一点吗?对于GNU awk 4.0+来说,这是最简单的,它有一个用于以下方面的机制: 即:
{ dups[$1]++ }
END {
PROCINFO["sorted_in"] = "@val_num_desc"; # <-- here: Array traversal in
# numerically descending order
# of values
for(num in dups) {
print num,dups[num]
}
}
请注意,我删除了自定义字段分隔符,因为它似乎没有必要(如果前导空格的数量不同,甚至是有害的)。如果出于某种原因想要保留它,除了
-t'-rgk2
之外,您还必须为sort
提供-b
选项以忽略awk输出中的前导空格。管道排序是gawk使用asort
的一个选项。
{ dups[$1]++ }
END {
PROCINFO["sorted_in"] = "@val_num_desc"; # <-- here: Array traversal in
# numerically descending order
# of values
for(num in dups) {
print num,dups[num]
}
}
awk '{dups[$1]++} END{ for(num in dups) {print num,dups[num]}}' filename | sort -t ' ' -rgk 2