【发布时间】:2016-12-07 17:13:43
【问题描述】:
我有一些来自脚本thescript 的输出,内容如下:
202 1 0 1 0 0 0
现在我想根据${SUM_MASK} 的值,选择性地将这个数字与awk 相加:
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
我怎样才能做到这一点?
【问题讨论】:
-
为什么需要
awk? -
我认为元素的数量并不总是固定为 7?
-
顺便说一句,我会考虑从函数或脚本的命令行获取两个输入,并统一格式(例如,允许空格 或 逗号用于两者)。读者有点不明白为什么选择了您请求的调用约定(一个参数取自预定义变量,另一个来自标准输入)。
-
@CharlesDuffy 我不一定需要
awk,但我也不确定是否使用bash。我认为awk的问题会少一些。我当然可以从命令行获得输入,但变量已经到位。无论哪种方式,它只是语法略有不同,仅此而已。唯一重要的是它必须是单行的,因为我使用的服务不允许我定义 shell 脚本。 @MarkSetchell 这会改变你想到的实现中的任何内容吗? -
我收到了很多非常有趣的贡献。鉴于这个问题,我可能应该接受 CharlesDuffy 或 glennjackmann 的答案,尽管 karafka 很可能是我真正需要的答案。