我有一个脚本thescript的输出如下:

202 1 0 1 0 0 0

现在我想根据aawk的值,有选择地用${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

10-04 11:07