添加从特定Ips生成的总累积数据

时间:2014-05-20 09:14:59

标签: linux perl shell awk sed

我有一个包含两个colums的数据列表。其中一个发送邮件的Ip和其他列包含通过邮件发送的总字节数。 我想要通过特定ip传输的所有数据的累计总数。 假设有4个条目:

192.168.0.100 40k
192.168.0.123 20k
192.168.0.100 15k
192.168.0.240 20k

然后,输出应为:

192.168.0.100 55k
192.168.0.123 20k
192.168.0.240 20k

3 个答案:

答案 0 :(得分:4)

这就是:

$ awk '{a[$1]+=$2} END { for (i in a) print i, a[i]"k"}' file
192.168.0.123 20k
192.168.0.100 55k
192.168.0.240 20k

解释

  • {a[$1]+=$2}将累积值存储在数组a[]中,其索引是该行的第一个字段。
  • END { for (i in a) print i, a[i]"k"}循环显示打印总计的值。注意k必须专门打印。

答案 1 :(得分:2)

这类似于awk解决方案,}{END{}块的perl快捷方式

perl -anE'$h{$F[0]} += $_ for /(\d+)k$/ }{say "$_ $h{$_}k" for sort keys %h' file

答案 2 :(得分:2)

我不知道每个地址发送了多少邮件,但忽略后缀可能会导致问题。这是使用awk和numfmt处理它的一种方法,这是GNU coreutils的最新成员:

# Lowercase k is a non-standard suffix and not supported by numfmt 
<file awk '$2=toupper($2)'  |

# We assume the k is IEC encoded, i.e. k=1024. Use --from=si if 1000 was intended
numfmt --field=2 --from=iec |

# Perform the summation, same as in @fedorqui's answer
awk '{ h[$1]+=$2 } END { for(k in h) print k, h[k] }' |

# Add appropriate suffixes. Again change to --to=si if k=1000
numfmt --field=2 --to=iec

输出:

192.168.0.100   55K
192.168.0.123   20K
192.168.0.240   20K