Awk 使用grep选择一些列

Awk 使用grep选择一些列,awk,grep,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 563

我有一个这样的文本文件

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

您输入的文件只有一行包含
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%清楚,所以进一步澄清会有帮助

我想你自己不明白你的剧本。您的脚本已仅对行contains
scenario.rsu.wlan.mac
进行了计算(平均值)。但是基于
grep Generalx
replica
它们来自输入参数。所以,试着理解你的剧本,找出你面临的真正问题。事实上,我觉得你只需要对你当前的脚本稍作修改。你先做一个cat,然后再做一个grep,所有这些都可以在awk中完成,在awk中,默认情况下,变量初始化为0,所以begin部分是多余的,试着保持它的紧凑性,比如
print(sum/n)
就足够了,不需要平均值,另外,
$2==副本
这可能仅适用于第一个副本line@abasu我猜这个脚本不是OP.Kent写的,是的,似乎是这样,有人花了很多时间来创建管道,所以需要一个长的水平滚动条来查看脚本的结尾line@abasu我认为
$2==replica
是可以的。