awk代码来计算某些节点的吞吐量

时间:2014-05-14 02:04:05

标签: awk ns2

在无线节点的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;
    }

但它不起作用

1 个答案:

答案 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

作为输出。