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

用于计算某些节点吞吐量的awk代码,awk,ns2,Awk,Ns2,在无线节点的ns-2跟踪文件中,我想一次计算一些节点的吞吐量。如何为特定节点设置if条件?问题是由于节点编号之间的“3;”造成的。如果我一个接一个地检查节点,这是非常耗时的,因为有数千个节点。以下是跟踪文件的示例: 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 t

在无线节点的ns-2跟踪文件中,我想一次计算一些节点的吞吐量。如何为特定节点设置if条件?问题是由于节点编号之间的“3;”造成的。如果我一个接一个地检查节点,这是非常耗时的,因为有数千个节点。以下是跟踪文件的示例:

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;
    }
action=$1;
sta=3美元;
时间=2美元;
目的地=4美元;
app=$7;
包装尺寸=8美元;
如果(操作==“r”&&dest==“MAC”&&app==“tcp”&&time>1&&((sta>=”&u6)
&&sta=“36”)){
如果(开始=0)开始=时间;
如果(时间>结束时间)结束时间=时间;
总和=总和+包装大小;
}

但它不起作用

您似乎在做以下事情:

if ($1=="r" && $7=="cbr" && $3=="_1_") {
    sec[int($2)]+=$8;
};
来自
fil2.awk
的一篇题为

虽然您希望在不同字段上匹配,并在一系列节点上匹配,但我假设您希望输出类似于:

sec[i] throughput[i]
从同一篇论文中,
sec[i]
是第二个,而
throughput[i]
这里将是每秒钟数据包大小的总和

该代码段中的
sec
数组正在存储四舍五入秒的数据包总和(四舍五入由
int()
提供),这意味着您不需要
开始
结束

由于要比较多个节点,因此可以将
添加到
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] }

作为输出。

请显示示例输入和所需输出。还请显示不同的数据变量。您正在将第7个字段与
tcp
进行比较,其中在您的数据中是
message
。不客气。基本的问题是,您正在与
sta
字段进行词汇比较。很容易看出您是否将
\u6
\u30
\u36
放在文件的单独行中,然后对其进行排序。输出是
\u36
\u36
\u6
,因为第2列中的
6
大于第2列中的
3
——tens组在直线比较中没有对齐。与其把它们排成一行,不如把它们当作数字来对待,让范围如你所期望的那样工作。谢谢你的解释
1 9360