2014-10-29 90 views
0

这是我的文件

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计算平均值!

+0

这'AWK Jotne 2014-10-29 06:36:21

回答

0

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

而是使用awk的变量,并使用-v放慢参数赋值

如:

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

这里awkvar是创建并与$var

价值,使这个传递一个awk varible改变你的脚本

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

+0

但是,如果你想采取列的平均数,我会建议Jotne的答案 – nu11p01n73R 2014-10-29 06:35:53

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的每一个数据,并通过点击次数除以它。

+0

如果还想根据第三列对数据进行排序,我该怎么办? – sgh 2014-10-29 14:28:13

+0

@sgh只需将其管理为'sort',它将根据路由类型进行排序:'awk'{a [$ 3] + = $ 2; b [$ 3] ++} END {for(i in a)print i,a [i]/b [i]}'air1.txt |排序' – Jotne 2014-10-29 18:16:42

+0

谢谢!它帮助了我! – sgh 2014-10-29 19:34:27