在无线节点的ns-2跟踪文件中,我想一次计算某些节点的吞吐量。如何为特定节点制作条件?问题是因为" _"节点号之间。如果我因为数千个节点而逐个检查节点,则非常耗时。这里是跟踪文件的示例:
r 1.092948833 _27_ MAC --- 171 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [37 0] 1 0 [-]
r 1.092948833 _28_ MAC --- 172 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [38 0] 1 0 [-]
r 1.092948833 _25_ MAC --- 173 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [39 0] 1 0 [-]
r 1.092948833 _21_ MAC --- 174 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [40 0] 1 0 [-]
r 1.092948833 _36_ MAC --- 175 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [41 0] 1 0 [-]
r 1.092948833 _29_ MAC --- 176 tcp 1560 [0 1a 19 0] ------- [4194333:0 4194334:0 32 4194334] [42 0] 1 0 [-]
我的awk代码:
action = $1;
sta = $3;
time = $2;
dest = $4;
app = $7;
pkt_size = $8;
if ( action == "r" && dest == "MAC" && app == "tcp" && time > 1 && ((sta >= "_6_"
&& sta <= "_30_") || (sta >= "_36_"))) {
if (start_ == 0) start_ = time;
if (time > end_) end_ = time;
sum_ = sum_ + pkt_size;
}
但它不起作用
答案 0 :(得分:1)
您似乎正在执行以下操作:
if ($1=="r" && $7=="cbr" && $3=="_1_") {
sec[int($2)]+=$8;
};
来自fil2.awk
的文章"ns-2 for the impatient"。
虽然您希望在不同的字段上匹配,并在一系列节点上匹配,但我们假设您希望输出类似于:
sec[i] throughput[i]
来自同一篇论文,其中sec[i]
是第二篇,throughput[i]
就像你的每一秒数据包大小的总和一样。
该代码段中的sec
数组存储了四舍五入的数据包总和(int()
提供的舍入),这意味着您不需要start_
或{{1} }。
由于您要比较多个节点,因此可以将end_
添加到_
以简化比较。这里修改了一个脚本版本,以便为要比较的节点生成秒数输出:
FS
请注意,#!/usr/bin/awk -f
BEGIN {FS="[[:space:]]|_"} # use posix space or underscore for FS
{
action = $1
time = $2
sta = $4 # shifted here because underscores are delimiters
dest = $6
app = $10
pkt_size = $11
if( action == "r" && dest == "MAC" && app == "tcp" &&
time > 1 && ((sta >= 6 && sta <= 30) || (sta >= 36))) {
sec[int(time)]+=pkt_size
}
}
END { for( i in sec ) print i, sec[i] }
测试现在是数字而不是字符串比较。如果我把它放到一个名为sta
的可执行awk文件中并对你的数据运行awko
我得到:
awko data
作为输出。