1

これらのような行があります

value: "15"

value: "20"

value: "3"

grepした後、これを入力パイプとして取得しています

... | grep value:

必要なのは、このパイプを使用して合計 15 + 20 + 3 を生成する単純な bash スクリプトです。

したがって、私のコマンドは次のようになります。

... | grep value: | calculate_sum_value > /tmp/sum.txt

sum.txt には、合計である単一の数値が含まれている必要があります。

どうすればbashでできますか?私はbashの経験がまったくありません。

4

2 に答える 2

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}'
于 2013-06-12T18:06:02.543 に答える
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パイプラインで実行すると、変更が現在のシェルではなくサブシェルにまとめられます。さて、サブシェルでもエコーを行います:

$ cat sample.txt | grep -oP ':\D+\K\d+' | { while read n; do ((sum+=n)); done; echo $sum; }
38

その方が良いですが、それでも値は現在のシェルにはありません。もっとトリッキーなことを試してみましょう

$ set -- $(cat sample.txt | grep -oP ':\D+\K\d+')
$ sum=$(IFS=+; bc <<< "$*")
$ echo $sum
38

はい、UUOCですが、OPのパイプラインが何であれ、これはプレースホルダーです。

于 2013-06-12T19:05:34.910 に答える