我有一个文件
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
但我不知道如何排序数组?是否可以这样做?
答案 0 :(得分:2)
对于GNU awk 4.0+来说,这是最直接的,它具有sorted array traversal的机制:
awk '{dups[$1]++} END{ PROCINFO["sorted_in"] = "@val_num_desc"; for(num in dups) {print num,dups[num]}}' filename
那是:
{ 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]
}
}
如果GNU awk不可用,请通过sort
:
awk '{dups[$1]++} END{ for(num in dups) {print num,dups[num]}}' filename | sort -t ' ' -rgk 2
请注意,我删除了自定义字段分隔符,因为它似乎没有必要(如果前导空格的数量不同,甚至会有害)。如果您出于某种原因想保留它,除了sort
之外,您还必须-b
-t ' ' -rgk 2
选项忽略awk输出中的前导空格。