这是我的格式。
Source IP Destination IP Received Sent
192.168.0.1 10.10.10.1 3412 341
192.168.0.1 10.10.10.1 341 43
192.168.0.1 10.22.22.2 34 334
192.168.0.1 192.168.9.3 34 243
但这是一个非常大的文件。我基本上想要给出每个源IP的总带宽。因此,我需要组合所有uniq源IP,然后添加所有唯一的接收列,然后添加已发送的列。最终结果将是:
source ip - 收到的总数据包 - 总发送数据包
同时获取源IP和目标IP也很好,所以我也可以获得
source ip - destination ip - 收到的总数据包 - 总发送数据包
非常感谢任何帮助
答案 0 :(得分:2)
只看源IP:
awk '
NR == 1 {next}
{
recv[$1] += $3
sent[$1] += $4
}
END {for (ip in recv) printf("%s - %d - %d\n", ip, recv[ip], sent[ip]}
' filename
对于源/目标对,只需稍作修改:
awk '
NR == 1 {next}
{
key = $1 " - " $2
recv[key] += $3
sent[key] += $4
}
END {for (key in recv) printf("%s - %d - %d\n", key, recv[key], sent[key])}
' filename
答案 1 :(得分:1)
红宝石(1.9 +)
#!/usr/bin/env ruby
hash_recv=Hash.new(0)
hash_sent=Hash.new(0)
hash_src_dst_recv=Hash.new(0)
hash_src_dst_sent=Hash.new(0)
f=File.open("file")
f.readline
f.each do |line|
s = line.split
hash_recv[s[0]] += s[2].to_i
hash_sent[s[0]] += s[-1].to_i
hash_src_dst_recv[ s[0,2] ] += s[2].to_i
hash_src_dst_sent[ s[0,2] ] += s[-1].to_i
end
f.close
p hash_recv
p hash_sent
p hash_src_dst_recv
p hash_src_dst_sent
试运行:
$ ruby test.rb
{"192.168.0.1"=>3787, "192.168.168.0.1"=>34}
{"192.168.0.1"=>718, "192.168.168.0.1"=>243}
{["192.168.0.1", "10.10.10.1"]=>3753, ["192.168.0.1", "10.22.22.2"]=>34, ["192.168.168.0.1", "192.168.9.3"]=>34}
{["192.168.0.1", "10.10.10.1"]=>384, ["192.168.0.1", "10.22.22.2"]=>334, ["192.168.168.0.1", "192.168.9.3"]=>243}
答案 2 :(得分:0)
我会做一个(有点格式化但你可以用一行编写):
sort file.txt | awk ' BEGIN {start = 1;}
{
ip = $1;
if (lastip == ip) {
sum_r += $3; sum_s += $4;
}
else
{ if (!start) print lastip ": " sum_r ", " sum_s
else
start = 0;
lastip = ip; sum_r = $3; sum_s = $4;
}
}
END { print lastip ": " sum_r ", " sum_s }'
答案 3 :(得分:0)
awk '{
if (NR==FNR){
Recieved[$1,$2]+=$3;Sent[$1,$2]+=$4;
}else{
if(Recieved[$1,$2]){
print $1" " $2" " Recieved[$1,$2]" "Sent[$1,$2];Recieved[$1,$2]=""
}
}
}' InputFile.txt InputFile.txt
InputFile被读取两次,因此在最后添加两次。 输入文件的首次出现(用于if(NR == FNR)条件)是构建两个数组,第二个输入文件(用于其他条件)是打印所有组合,并将数组值设置为空白,以便我们不再打印。
以下格伦的解决方案非常优越,它只读取文件一次