ファイル内のすべての数値をすばやく合計するにはどうすればよいですか?


16

各行の1列にテキストと数字が含まれています。各行の数値の合計を計算する必要があります。どうやってやるの?THX

example.logに含まれるもの:

time=31sec
time=192sec
time=18sec
time=543sec

答えは784でなければなりません


このメソッドawk '{sum + = $ 1};を試しました。END {print sum} 'example.logが、それは行の数字のみです
ジャック、

2
中に同じ質問はほとんどありスタックオーバーフローどのように私はすぐに、ファイル内のすべての数値を合計することができますか?。たぶん、クロスサイトの複製を作成する時間ですか?
fedorqui

回答:


18

あなたの場合はgrepサポートの-oオプション、あなたが試すことができます:

$ grep -o '[[:digit:]]*' file | paste -sd+ - | bc
784

POSIXly:

$ printf %d\\n "$(( $(tr -cs 0-9 '[\n*]' <file | paste -sd+ -) ))"
784

16

GNUの新しいバージョン(4.x)の場合awk

awk 'BEGIN {FPAT="[0-9]+"}{s+=$1}END{print s}'

awkのsで試してください:

awk -F '[a-z=]*' '{s+=$2}END{print s}'

4
あなたは必要とするs+0場合にはs空になって、それが印刷される0代わりに、空。
クオンルム

それを説明させてください。- s空にできるケースは1つだけです。入力データにが含まれていない場合(つまり、入力まったくない場合)。その場合、2つの動作が可能です。1)入力なし=>出力なし、または2)0のみの場合は常に何かを出力します。両方とも、アプリケーションのコンテキストに応じて適切なオプションです。+0)オプション2に取り組んでいます。オプション1)に対処するには、を書く必要がありますEND {if(s) print s}。-したがって、質問で指定されるまで、どちらのオプション(データのないこのコーナーケースの場合)を想定しても意味がありません。
ジャニス

10
awk -F= '{sum+=$2};END{print sum}'

2
長い形式の回答をお勧めします。これがどのように機能するか詳しく説明していただけますか?
slm

2
@slm、その答えはここの他の答えよりも多かれ少なかれ冗長ではなく、自明です。それはまたのような入力での作業の利点があるtime=1.4e5sec
ステファンChazelas

@StéphaneChazelas-同意しましたが、これは新規ユーザーであり、ユーザーは1行以上の回答を提供することをお勧めします。それがどのように機能するかを説明するテキストは、コードよりもはるかに強力な答えになります。
slm

4
@slm、これは(技術的な観点から)ベストアンサーの1つを持つ新しいユーザーであり、2つのダウン票と否定的なコメントを受け取ります。とても温かい歓迎ではありません。
ステファンシャゼル

1
@ TomFenech、awkのPOSIX構文では、これらのパターン/アクション項目を「;」で区切る必要があります または「改行」です。この「;」なしで失敗するawk実装を見つけることができます。
ステファンシャゼル

7

別のGNUのawkもの:

awk -v RS='[0-9]+' '{n+=RT};END{print n}'

perl1:

perl -lne'$n+=$_ for/\d+/g}{print$n'

POSIX 1:

tr -cs 0-9 '[\n*]' | grep . | paste -sd + - | bc

6
sed 's/=/ /' file | awk '{ sum+=$2 } END { print sum}'

素晴らしい答えですが、必要はありませんsedawk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
user1717828

@ user1717828:-F'='代わりに(より短く、より互換性のある!)を使用する必要があります--field-separator =
オリビエデュラック

@OlivierDulac、奇妙な、私のman awk唯一の与える-F fs--field-separator fs
user1717828

@ user1717828:-F'='または-F '='2つの方法-F fs(fsは「=」の場合)です。シェルではなくawkによってfsが適切に表示および解釈されるように、シングルクォートを追加しました(fsが「;」の場合に役立ちます)
オリビエデュラック

4

これを試すことができます:

awk -F"[^0-9]+" '{ sum += $2 } END { print sum+0; }' file

4

誰もが素晴らしいawk答えを投稿しましたが、私はそれをとても気に入っています。

交換@cuonglmするバリエーションgrepsed

sed 's/[^0-9]//g' example.log | paste -sd'+' - | bc
  1. sed数字以外のすべてを取り除きます。
  2. このpaste -sd+ -コマンドは、すべての行を単一の行として結合します
  3. bc式を評価します

3

電卓を使用する必要があります。

{ tr = \ | xargs printf '[%s=]P%d+p' | dc; } <infile 2>/dev/null

印刷する4行で:

time=31
time=223
time=241
time=784

より簡単に:

tr times=c '    + p' <infile |dc

...印刷する...

31
223
241
784

スピードがあなたがそれからあなたがしているものであるならばdc、あなたが望むものです。従来はbcコンパイラでしたが、それでも多くのシステム向けです。


応じていない私の測定:それはあなたが式を生成するためにしなければならないどのくらいの作業依存
グレンはジャックマン

@glennjackman-あなたの測定値にはdc、私が知る限りは含まれていません。あなたは何について話していますか?
mikeserv

ちなみに、古いクルーを新しいクルーと比較する場合(perl標準のUNIXツールセットをベンチマークする場合など)、GNUツールチェーン上でコンパイルされたGNUツールを使用する場合、実際にはあまり意味がありません。マイナスのPerlのパフォーマンスに影響を与える可能性が肥大化のすべてがあるにもすべてのものをGNUコンパイルGNU utilsパッケージの。悲しいけれど事実です。違いを正確に判断するには、実際の、単純に構築された、シンプルなツールセットが必要です。たとえば、musl libsに対して静的にリンクされた家宝道具セットのように-そのようにして、1つのツール/ 1つのジョブのパラダイムと1つのツールからすべてのルールのパラダイムをベンチできます。
mikeserv

3

python3を介して、

import re
with open(file) as f:
    m = f.read()
    l = re.findall(r'\d+', m)
    print(sum(map(int, l)))

re.findall文字列のリストを返しますが、これは機能しません
-iruvar

@ 1_CR ya、私はそれを忘れています。今すぐ確認してください。
アビナッシュラジ

たぶんsum(int(e) for e in l)もっとpythonicです。
クオンルム

3

純粋なbashソリューション(Bash 3+):

while IFS= read -r line; do                   # While it reads a line:
    if [[ "$line" =~ [0-9]+ ]]; then      # If the line contains numbers:
        ((counter+=BASH_REMATCH[0]))          # Add the current number to counter
    fi                                    # End if.
done                                  # End loop.

echo "Total number: $counter"         # Print the number.
unset counter                         # Reset counter to 0.

短縮版:

while IFS= read -r l; do [[ "$l" =~ [0-9]+ ]] && ((c+=BASH_REMATCH)); done; echo $c; c=0

1
たぶん:PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile
mikeserv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.