【问题标题】:How to increment array dynamically with 'awk'?如何使用'awk'动态增加数组?
【发布时间】:2013-04-15 01:54:17
【问题描述】:

我有一个包含 IP 列表的文件:

1.1.1.1
2.2.2.2
3.3.3.3
5.5.5.5
1.1.1.1
5.5.5.5

我想创建打印上述 IP 计数器列表的文件,例如:

1.1.1.1: 2
2.2.2.2: 1
3.3.3.3: 1
5.5.5.5: 2

其中 2,1,1,2 是计数器。

我开始编写适用于最终计数 IP 和已知计数但不知道如何继续的脚本

 ./ff.sh file_with_IPs.txt

脚本

#!/bin/sh

file=$1

awk  '
BEGIN {
    for(x=0; x<4; ++x)
        count[x] = 0;

 ip[0] = "1.1.1.1";
 ip[1] = "2.2.2.2";
 ip[2] = "3.3.3.3";
 ip[3] = "5.5.5.5";    
}
{
    if($1==ip[0]){
       count[0] += 1;
     } else if($1==ip[1]){
       count[1] += 1;
     }else if($1==ip[2]){
       count[2] += 1;
     }else if($1==ip[3]){
       count[3] += 1;
     }
}
END {
    for(x=0; x<4; ++x) {
       print ip[x] ": " count[x]
    }
}
' $file > newfile.txt

主要问题是我不知道文件中存储了多少 IP 以及它们的外观。

所以每次 awk 捕获新 IP 时,我都需要增加数组 ip

【问题讨论】:

  • 您是否考虑过改用uniq?或者你有什么理由想留在 awk 中?
  • 我在文件列表上运行,并且文件不仅包含 ips(还包含其他垃圾)。使用 awk 我可以获取 ip 作为值
  • 但如果您知道怎么做,欢迎使用uniq 发布您的答案:)

标签: arrays linux awk


【解决方案1】:

您可以使用uniq 来完成该任务,例如:

sort IPFILE | uniq -c

(注意,这会打印 IP 前面的出现次数。)

或使用 awk(如果行中只有 IP 地址):

awk '{ips[$0]++} END { for (k in ips) { print k, ips[k] } }' IPFILE

(请注意,这会打印无序的 IP 地址,但您可以使用 awk 执行此操作,阅读文档,asortasorti,或者只是在管道后附加 sort。)

【讨论】:

  • 很有趣的是,我们在同一时刻编写了几乎相同的代码。刚改了变量名!
【解决方案2】:

我认为使用sort -u 会更容易,但是使用 awk 可以做到这一点:

awk '{a[$0]++; next}END {for (i in a) print i": "a[i]}' file_with_IPs.txt

输出:

1.1.1.1: 2
3.3.3.3: 1
5.5.5.5: 2
2.2.2.2: 1

(在this tutorialsudo_O recommended me 的帮助下)

【讨论】:

  • "next" 在这里不是必须的。
  • 嗯,我明白了——因为我们在 END 之前没有执行任何其他操作,所以这个语句无论如何都会转到下一条记录。我会保持原样,而不是像 Zsolt 那样得到确切的答案。不管怎样,谢谢你现在让我,@Kent。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多