ns3产生带参数的跟踪文件tr及参数提取(cut命令使用)

仿真时,通常需要根据不同的参数产生不同数据并写入不同的文件。本文给出了如何让程序根据不同参数自动运行,产生带参数的跟踪文件tr,从跟踪文件名提取参数,并附cut命令简易使用指南。

1. 程序根据不同参数运行多次

写一个Python脚本,让程序根据不同的参数自动运行多次,详情参见博文《写Python脚本让带参数程序运行多次》。源代码如下:

for pktCount in range(4000, 8000, 500):
  os.('./wafsystem --run "scratch/AliceBob_class_main --flag=1 --pktCount=%d"' %(pktCount))

2. 产生带参数的跟踪文件tr

因为是让程序根据不同的参数自动运行,这就需要将每次运行的结果存储在不同的文件。使用C++的string和stringStream类可以实现这一点(使用流生成字符串),相关源代码如下:

include<string>
include<sstream>

ostringstream oss;
oss<<"AliceBob_XOR_"<<pktCount<<".txt";
string filename = oss.str();

AsciiTraceHelper ascii;
Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream (filename);

本例使用数据包数目pktCount将不同跟踪文件区分开,建议使用有意义的参数来区别文件名(比如传入程序的参数),而不是使用简单的递增命名文件(如i++),因为除了文件名更加直观外,还可以从文件名提取这些不同的参数服务于后续的数据分析。运行脚本执行程序,便可得到一系列跟踪文件,如:

AliceBob_XOR_4000.tr
AliceBob_XOR_4500.tr
AliceBob_XOR_5000.tr
AliceBob_XOR_5500.tr
AliceBob_XOR_6000.tr
AliceBob_XOR_6500.tr
AliceBob_XOR_7000.tr
AliceBob_XOR_7500.tr
AliceBob_XOR_8000.tr

3. 从跟踪文件名提取参数

提取跟踪文件名中的参数(如本例:数据包数量)很有意义,比如可以作为图形的x轴。提取思路:将文件名作为字符串,用cut命令(remove sections from each line of files)将文件名(不包括后缀)取出来(以点作为分隔),再取出数值(以下划线作为分隔)。

#!/bin/bash 
for file in *.tr
do
echo $file | cut -f 1 -d '.' | cut -f 3 -d '_' 
done

运行上述shell脚本,得到结果如下(可以用‘>’或‘>>’将结果重定向到一个文件):

4000
4500
5000
5500
6000
6500
7000
7500
8000

提取的参数是按字符串排序的,这样的话就会出现诸如1000在200之前,要让其按数值排序,只需在上述shell脚本加个管道“| sort -n”,排序下就可以了。我还遇到这样的情况,参数是小数,这样的话(小数的点与.tr的点)就不能用cut来分割,可以用管道“| sed ‘s/.tr//g’”将.tr字符串替换成空字符串。

4. cut命令使用

cut功能是从文件中每行选择特定的部分输出(Print selected parts of lines from each FILE to standard output),用man cut查看手册,这里简单做个笔记,以便后续使用。cut命令格式如下:

cut OPTION... [FILE]...

参数如下:

-b, -c, -f分别指字节byte,字符character,字段field,后面需要加操作范围N-M(N,N-,-M,N-M)
-d是界定符delimiter(默认是TAB),即以什么界定符划分字符串
-s是指不输出那些不包含界定符的行
-s –output-delimiter=STRING是指以STRING作为输出界定符
FILE可以是多个文件

Leave a Reply

Your email address will not be published. Required fields are marked *