如何排序数组元素?

时间:2015-04-21 09:54:48

标签: 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: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

但我不知道如何排序数组?是否可以这样做?

1 个答案:

答案 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输出中的前导空格。