[已解决] 请教一个awk取值求和的问题!

请教一个awk取值求和的问题!
$ cat qhost |awk ‘NF==3’
X5600.q BIP 0/12/12
all.q BIP 0/0/12
想求第一行后面的0/12/12的中间的12和第二行的0/0/12中间的0的和。

因为想写一个脚本程序,涉及到用awk循环,是希望直接在NF==3后面写;而不是前处理或者再整一个管道$ cat qhost |awk ‘NF==3’|awk -F"/" ‘{a+=$2}END{print a}’

有方法不?

$ cat qhost |awk 'NF==3'|awk -F"/" '{a+=$2}END{print a}'

X5600.q BIP 0/12/12
这里你不觉得的’NF==3’ 有点多余吗
直接用’/'分割不是一样的吗?

$ cat qhost | awk -F"/" '{a+=$2}END{print a}'

qhost里面有很多行的,大哥!NF==3代表只输出只含3列的。

我前面不是写的很清楚了吗,我要做循环,只用一个awk。不是只有那一个地方有“/”的符号,时间那些都有,先用’/'分割,整乱套了,而且时间这些我还要用的。

qhost文件内容:
HOSTNAME ARCH NCPU LOAD MEMTOT MEMUSE SWAPTO SWAPUS

global - - - - - - -
compute-0-0 lx26-amd64 12 11.99 23.6G 1.6G 11.7G 10.8M
X5600.q BIP 0/12/12
22533 0.53643 ccdcpmo11v pom r 12/09/2013 20:44:17 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-1 lx26-amd64 12 12.31 23.6G 3.7G 11.7G 14.2M
X5600.q BIP 0/12/12
20747 0.52500 PWV2-SC2H6 pom r 12/02/2013 05:44:05 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
22357 0.55929 fli3 test r 12/08/2013 15:33:32 MASTER
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-2 lx26-amd64 12 12.01 23.6G 3.4G 11.7G 10.8M
X5600.q BIP 0/12/12
20924 0.52500 pom-la zhantt r 11/27/2013 14:18:41 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
22357 0.55929 fli3 test r 12/08/2013 15:33:32 SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-3 lx26-amd64 12 12.09 23.6G 6.9G 11.7G 230.8M
X5600.q BIP 0/12/12
22357 0.55929 fli3 test r 12/08/2013 15:33:32 SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
22649 0.54786 m1 somy r 12/10/2013 21:46:17 SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-4 lx26-amd64 12 11.99 23.6G 1.7G 11.7G 12.9M
X5600.q BIP 0/12/12
22526 0.51357 c12 wangsm r 12/09/2013 22:05:02 MASTER
SLAVE
SLAVE
SLAVE
22785 0.52500 ZnPd15Se10 yanyk r 12/11/2013 16:12:32 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-5 lx26-amd64 12 12.00 23.6G 6.8G 11.7G 12.6M
X5600.q BIP 0/12/12
18915 0.53643 m3_vasp_op duandf r 11/08/2013 14:44:26 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-6 lx26-amd64 12 12.00 23.6G 8.9G 11.7G 13.8M
X5600.q BIP 0/12/12
21119 0.53643 m3_F duandf r 11/29/2013 09:35:50 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-7 lx26-amd64 12 8.06 23.6G 5.5G 11.7G 213.6M
X5600.q BIP 0/8/12
22649 0.54786 m1 somy r 12/10/2013 21:46:17 SLAVE
SLAVE
SLAVE
SLAVE
22707 0.51357 OH-1 wangnn r 12/11/2013 08:57:17 MASTER
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-8 lx26-amd64 12 12.36 23.6G 3.0G 11.7G 135.5M
X5600.q BIP 0/12/12
22567 0.51357 BN-HArF-6- wuqq r 12/10/2013 11:04:02 MASTER
SLAVE
SLAVE
SLAVE
22592 0.53643 ah2o-opt pom r 12/10/2013 15:06:47 MASTER
SLAVE
SLAVE
SLAVE
22886 0.51357 V6O14-Me-c langll r 12/12/2013 09:52:32 MASTER
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-9 lx26-amd64 12 12.02 23.6G 9.2G 11.7G 56.8M
X5600.q BIP 0/12/12
22566 0.51357 BN-HArF-5- wuqq r 12/10/2013 11:03:32 MASTER
SLAVE
SLAVE
SLAVE
22940 0.52500 TS4 esom r 12/12/2013 15:21:32 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12
compute-0-9 lx26-amd64 12 12.00 23.6G 5.9G 11.7G 14.4M
X5600.q BIP 0/12/12
20914 0.51357 FIrpicPOPB somy r 11/27/2013 08:56:56 MASTER
SLAVE
SLAVE
SLAVE
22649 0.54786 m1 somy r 12/10/2013 21:46:17 MASTER
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
SLAVE
all.q BIP 0/0/12

awk 不是一个命令 而是一种语言 后面可以写好多语句的 现在没办法测试 我在win下呢 :shutup:

我知道是一种语言。我用awk写的这个脚本已经实现了,每个节点(compute-0-)下面的那个和(现在要求的)就是每个节点任务的MASTER+SLAVE数目;但我现在想用另外一个种思路实现,就卡到这了

自己搞定,把方案列出来一下
cat qhost |awk ‘NF==3{split($3,a,“/”);ntask+=a[2]}END{print ntask}’

解释一下:对于0/12/12 这种想取中间的数字,可以用awk语言中的split,split(“要分隔的字符串”, 存放的数组,“分隔符”),这样要去中间的数字就是a[2],后面就是去和了,这个就简单了

awk ‘NF==3 {split($3,x,“/”);a+=x[2]} END {print a}’ qhost

既然有文件,何必用 管道? 直接读取,省个命令.

1


这个 怎么在 脚本中 实现呢?

2\居然 没注意,怎么点了个 无聊

3
用 grep 代替 Cat 事先检索出 符合条件的行,再交给 awk 处理.


或者
grep “BIP” qhost.txt|awk -F"/" ‘{a+=$2} END {print a}’

总结一下 我这有 5个方法,个人认为 不用 split 的第5个方法 最好用.

#/bin/sh
#用于计算 qhost.txt 中 BIP 记录的 日期号相加之和,建议 看qhost.txt结构和内容
echo 方法1
a=0
for x in `grep "BIP" qhost.txt|cut -d"/" -f2` ; do 
	a=$(($x+$a)) 
done
echo $a \\n

echo 方法2
grep "BIP" qhost.txt|awk -F"/" '{a+=$2} END {print a,"\012"}'

echo 方法3
awk '$2=="BIP" {split($3,a,"/");x+=a[2]} END {print x,"\012"} ' qhost.txt

echo 方法4
awk '$2=="BIP"' qhost.txt|awk -F"/" '{a+=$2} END {print a,"\012"}'

echo 方法5
awk -F"/" '$1~"BIP" {a+=$2} END {print a}' qhost.txt

用 / 作为 分隔符也是可以的, 我们可以用 正则 规定出要进行计算的 行的具体 结构特点

awk -F"/" '$0~"^ +?[a-zA-Z.0-9]+  +BIP +[0-9]+?/[0-9]+?/[0-9]+? +?$" {a+=$2} END {print a}' qhos.txt

好久没登录论坛了,非常感谢!