在awk中读取行并使用$ line

时间:2014-10-29 06:10:00

标签: awk while-loop readline

这是我的档案

air1.txt

fc:75:16:d2:91:a3   -90 targol
78:54:2e:7f:e8:9e   -88 DLink
fc:75:16:d2:91:a3   -89 targol
78:54:2e:7f:e8:9e   -89 DLink
78:54:2e:7f:e8:9e   -88 DLink
78:54:2e:7f:e8:9e   -87 DLink
fc:75:16:d2:91:a3   -90 targol

我想计算第三列中每个名字的第二列平均值!这是我的手册!

RSSI=$(awk '{print $3}' air1.txt | sort -u | while read line; do awk < air1.txt '{print $2,$3}' | grep $line | ./rssiMean.sh |cut -d'.' -f1 |awk '{print $line,$1}' ;done)
echo $RSSI

但结果是

-88 -88 -89 -89

为什么我无法获得$line?! BTW ./rssiMean.sh计算平均值!

2 个答案:

答案 0 :(得分:3)

这应该做:

awk '{a[$3]+=$2;b[$3]++} END {for (i in a) print i,a[i]/b[i]}' air1.txt
DLink -88
targol -89.6667

它总结第3列中每个数据的数字,并将其除以命中数。

答案 1 :(得分:0)

您不能在awk脚本中使用bash变量。

而是使用awk变量并使用-v参数

指定值

例如:

$var=123
$awk -v awkvar=$var '{print awkvar}' 

此处awkvar是一个创建的awk变量,其值为$var

在您的脚本中进行此更改

RSSI=$(awk '{print $3}' air1.txt | sort -u | while read line; do awk < air1.txt '{print $2,$3}' | grep $line | ./rssiMean.sh |cut -d'.' -f1  |awk -v line=$line '{print line,$1}' ;done)
echo $RSSI

所做的更改是

awk -v line=$line '{print line,$1}

awk varible line被赋值为bash varibale $line