我有一个脚本thescript
的输出如下:
202 1 0 1 0 0 0
现在我想根据a
awk
的值,有选择地用${SUM_MASK}
对这个数字求和:SUM_MASK=1,1,0,0,0,0,0
我想要一些像:
thescript | awk <SOMETHING>
其中
thescript
的每个数字输出乘以${SUM_MASK}
中的相应数字,得到:203
结果是:
203=202*1+1*1+0*0+1*0+0*0+0*0+0*0
这类似于电子表格软件中的
sumproduct
功能。下面的代码狙击手可以做到这一点,但我想避免使用进程替换:
SUM_MASK="1,1,0,0,0,0,0"; paste <(thescript) <(echo ${SUM_MASK} | tr ',' '\n') | awk '{ SUM += $1 * $2 } END { print SUM }'
以及命名管道:
SUM_MASK="1,1,0,0,0,0,0"; mkfifo fA; mkfifo fB; thescript > fA & echo ${SUM_MASK} | tr ',' '\n' > fB & paste fA fB | awk '{ SUM += $1 * $2 } END { print SUM }' > result.text; rm -f fA fB
我怎么能做到?
最佳答案
echo "202 1 0 1 0 0 0" |
awk -v summask="1,1,0,0,0,0,0" '
BEGIN {split(summask, mask, /,/)}
{ sumproduct=0
for (i=1; i<=NF; i++) {
sumproduct += $i * mask[i]
}
print sumproduct
}
'
203