我有一个像这样的文本文件
Experiment Replica Module Obs
General0 0 scenario.host[12].wlan.mac 189
General0 0 scenario.host[4].wlan.mac 1109
General0 0 scenario.host[2].wlan.mac 1250
General0 0 scenario.host[0].wlan.mac 1150
General0 0 scenario.host[6].wlan.mac 5636
General0 0 scenario.host[102].wlan.mac 16826
General0 0 scenario.rsu.wlan.mac 41030
我将在“scenario.rsu.wlan.mac”之后的列中计算数字总和
使用此脚本
#!/bin/bash
INPUT_FILES=$1
EXPERIMENTS=$2
REPLICAS=$3
if [ -z "$INPUT_FILES" ]
then
echo "usage: $0 input data file.data (willcards allowed)"
fi
echo "Experiment Replica Mean"
find . -name "$INPUT_FILES" | while read file
do
export MODULE=`echo $file | cut -d- -f 2`
MODULE=${MODULE/.data/}
for EXP in $EXPERIMENTS;
do
for REP in $REPLICAS;
do
DATA=`cat "$file" | grep General$EXP | awk -v replica=$REP 'begin {sum=0;n=0} {if ($2 == replica && $3 == "scenario.rsu.wlan.mac") { sum+=$4;n+=1} } END {mean=sum/n; print mean}'`
MEAN=`echo $DATA | awk '{print $1}'`
echo "General$EXP $REP $MEAN"
done
done
done
请注意,当我想计算所有第四列时,代码运行良好,但我无法选择包含“scenario.rsu.wlan.mac”的行。
答案 0 :(得分:1)
您输入的文件只有一行包含scenario.rsu.wlan.mac
,所以我将使用以下内容进行说明:
$ cat file
Experiment Replica Module Obs
General0 0 scenario.host[12].wlan.mac 189
General0 0 scenario.host[4].wlan.mac 1109
General0 0 scenario.host[2].wlan.mac 1250
General0 0 scenario.host[0].wlan.mac 1150
General0 0 scenario.host[6].wlan.mac 5636
General0 0 scenario.host[102].wlan.mac 16826
General0 0 scenario.rsu.wlan.mac 41030
General0 0 scenario.rsu.wlan.mac 34234
General0 0 scenario.rsu.wlan.mac 4453
只测试第三个字段是否匹配,求和第四个字段并在END
块中打印结果:
$ awk '$3=="scenario.rsu.wlan.mac"{s=s+$4}END{print "Sum:",s}' file
Sum: 79717
您的脚本中存在许多不良做法,您的问题并非100%明确,因此进一步说明会有所帮助。