【问题标题】:awk code to calculate throughput for some nodes用于计算某些节点的吞吐量的 awk 代码
【发布时间】:2014-07-01 21:49:08
【问题描述】:

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

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;
    }

但它不起作用

【问题讨论】:

  • 请显示示例输入和所需的输出。
  • 另外请显示不同的数据变体。您正在将第 7 个字段与 tcp 进行比较,在您的数据中它是 message

标签: awk ns2


【解决方案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] 就像你每秒数据包大小的总和。

来自该 sn-p 的 sec 数组存储舍入秒数的数据包总和(舍入由 int() 提供),这意味着您不需要 start_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 测试现在是数字而不是字符串比较。如果我将其放入名为 awko 的可执行 awk 文件中并针对您的数据以 awko data 运行,我会得到:

1 9360

作为输出。

【讨论】:

  • 不客气。基本问题在于您与sta 字段进行的字典比较。很容易看出您是否将_6__30__36_ 放在文件的单独行中,而sort 它。输出为_36__36__6_,因为第二列中的6 大于第二列中的3 - 十个组在直接字符串比较中没有对齐。与其将它们排列起来,不如将它们视为数字,让范围按您的预期工作。
  • 谢谢您的解释
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2012-11-22
  • 2020-07-19
  • 2019-06-03
相关资源
最近更新 更多