0

このようなテキストファイルがあります

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

4 番目の列すべてを計算したいが、「scenario.rsu.wlan.mac」を含む行を選択できない場合、コードはうまく機能することに注意してください。

4

1 に答える 1

1

入力ファイルには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

3 番目のフィールドが一致するかどうかをテストし、4 番目のフィールドを合計して、結果をENDブロックに出力します。

$ awk '$3=="scenario.rsu.wlan.mac"{s=s+$4}END{print "Sum:",s}' file
Sum: 79717

スクリプトには多くの悪い慣行があり、質問は 100% 明確ではないため、さらに明確にすることが役立ちます。

于 2013-05-14T13:04:19.457 に答える