web-dev-qa-db-ja.com

grepの結果から数値を追加する

次のコマンドを実行します。

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

そして私は次の結果を得ます:

1
4
0
8

ランニングカウント変数までの各数値を追加したいと思います。誰かが私を助けてくれる魔法のワンライナーはありますか?

24
Amir Afghani
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

リストは出力されませんが、合計は出力されます。リストと合計の両方が必要な場合は、次のようにすることができます。

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'
34
Shawn J. Goff

これはすべてawkでも実行できます。

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt
8
Trey Hunner

[〜#〜] gnu [〜#〜]システムを使用しているように見えるため、Perl正規表現のサポートが利用可能な場合は、次のように記述できます。

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

追伸正規表現を変更して(+数量詞を追加)、9より大きい数値を許可しました。

追伸あるいは、awkで十分です(GNU awkと仮定):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile
6

私はこれを使います:

$ echo $(cat file | sed 's/$/+/') 0 | bc

大きなリストの場合は効率的ではありませんが、私のほとんどのユースケースでは問題ありません。私は通常、シェル関数を使用してプロセスを自動化しているので、ファイル名を指定するだけで済みます。

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

データが別の方法で区切られている場合は、特定の要素セパレーターまたは文字クラスを行末マーカーでいつでも置き換えることができます。

3
deaks

あなたのgrepからの出力をパイプしてみてください

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'
3
user591