用grep选择一些列

时间:2013-05-14 12:59:15

标签: awk grep

我有一个像这样的文本文件

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”的行。

1 个答案:

答案 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%明确,因此进一步说明会有所帮助。