0

我有一个包含许多条目的文件,例如

1365593957.914 172.27.15.16 593
1365593969.237 172.27.15.31 1149
1365593979.239 172.27.15.33 5696
1365593989.242 172.27.15.31 1338
1365593999.344 172.27.15.33 21406

这些是时间戳 ip 数据大小。

$tp1如果时间戳介于和之间,我需要每个 ip 的所有数据大小的总和$tp2。我尝试逐行读取文件,然后在每一行上应用 awk 以检查时间戳范围,但它不起作用。另外,我不知道如何分类地添加这些。

4

1 回答 1

2
awk -v tp1=$tp1 -v tp2=$tp2 '$1 > tp1 && $1 < tp2 {
    total[$2] += $3;
}
END {
    for (ip in total)
         print "IP:", ip, "=>", total[ip];
}'

看起来很简单。如果这对你不起作用,它在什么方面不起作用?

编辑:重新格式化。缩进被忽略了,不知道为什么。

解释:

  • -v tp1=$tp1意思是“在名为tp1的 awk 中使用名为tp1的 shell 变量的值创建变量。
  • $1 > tp1 && $1 < tp2意思是“仅当第一个字段的值大于tp1的值且小于tp2的值时才执行此代码块。
  • total[$2] += $3;使用第二个字段(IP 地址)的值作为隐式声明的名为“tota”的数组的数组索引,并添加第三个字段的值。
  • AWK 将遍历输入中的所有记录,默认记录是单行文本。对于每条记录,如果条件成立,就会执行上面的代码。
  • END标识在处理完所有记录后执行的代码块,而不是针对每个(匹配的)输入记录执行。
  • for (ip in total)标识另一个迭代器:对于存储在数组 named 中的每个值total,将数组索引的名称分配给变量 named ip,并执行相关的代码块。
  • 在这种情况下,相关的代码块是print "IP:", ip, "=>", total[ip];,它打印字符串“IP:”,一个空格,如果变量命名ip(这是一个 IP 地址,用作数组索引名称)的值,另一个空格,字符串“= >”,另一个空格,以及存储在total由 IP 地址索引的数组中的值。

任何问题?

于 2013-04-23T17:51:08.400 回答