我的行看起来像这些
value: "15"
value: "20"
value: "3"
我在grepping
之后将其作为输入管道... | grep value:
我需要的是一个简单的bash脚本,它接受这个管道并为我提供总和 15 + 20 + 3
所以我的命令是:
... | grep value: | calculate_sum_value > /tmp/sum.txt
sum.txt应包含一个数字,即总和。
我怎么能用bash做什么?我根本没有使用bash的经验。
答案 0 :(得分:4)
您可以尝试awk
。这样的事情应该有效
... | grep value: | awk '{sum+=$2}END{print sum}'
你可以像这样完全避免grep
.... | awk '/^value:/{sum+=$2}END{print sum}'
更新
您可以使用"
选项将-F
字符添加为字段分隔符。
... | awk -F\" '/^value:/{sum+=$2}END{print sum}'
答案 1 :(得分:3)
我的第一次尝试是抓住冒号右侧的东西,然后让bash求它:
$ sum=0
$ cat sample.txt | while IFS=: read key value; do ((sum += value)); done
bash: ((: "15": syntax error: operand expected (error token is ""15"")
bash: ((: "20": syntax error: operand expected (error token is ""20"")
bash: ((: "3": syntax error: operand expected (error token is ""3"")
0
所以,必须删除引号。好吧,使用花哨的Perl正则表达式来提取冒号右边的第一组数字:
$ cat sample.txt | grep -oP ':\D+\K\d+'
15
20
3
好的,继续:
$ cat sample.txt | grep -oP ':\D+\K\d+' | while read n; do ((sum+=n)); done; echo $sum
0
咦?哦,是的,在管道中运行while
会将修改放在子shell中,而不是在当前shell中。那么,也要在子shell中做回声:
$ cat sample.txt | grep -oP ':\D+\K\d+' | { while read n; do ((sum+=n)); done; echo $sum; }
38
那更好,但仍然没有在当前的shell中。让我们尝试一些棘手的事情
$ set -- $(cat sample.txt | grep -oP ':\D+\K\d+')
$ sum=$(IFS=+; bc <<< "$*")
$ echo $sum
38
是的,UUOC,但无论OP的管道是什么,它都是占位符。