web-dev-qa-db-ja.com

ファイル内の行の数値を合計するにはどうすればよいですか

次のようなファイルがあります。

1
3
4
1
4
3
1
2

この合計(つまり、1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)を見つけるにはどうすればよいですか?

21
Tim

bcを少し助けてpasteの助けを借りて、+を区切り文字として1行の行を取得します。

paste -sd+ file.txt | bc

静的ファイルの代わりにgrep(または他のコマンド)の出力を使用するには、grepのSTDOUTをpasteのSTDINに渡します。

grep .... | paste -sd+ | bc

例:

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

bashを使用する必要がある場合は、配列を使用してファイルの内容を保存し、要素を反復処理するか、ファイルを1行ずつ読み取って各行の合計を計算することができます。効率的:

$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19

real    0m0.000s
user    0m0.000s
sys 0m0.000s
39
heemayl

Awkも使用できます。 Word "hello"を含む*。txtファイルの行の総数を数えるには:

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

ファイル内の数字を単純に合計するには:

awk '{n += $1}; END{print n}' file.txt
16
CrazyApe84

パッケージnum-utilsnumsumを使用してください!

Sudo apt-get install num-utilsが必要になる場合があります)

コマンドnumsumは、デフォルトで必要なことを実行します。

$ numsum file.txt 
19

stdinから1行ずつテスト番号を読み取る:

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

または、1行から読み取ります。

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19


その他のユーティリティ

このパッケージには、もっと有名になるに値する数値処理用のその他のユーティリティがいくつか含まれています。

numaverage   - find the average of the numbers, or the mode or median
numbound     - find minimum of maximum of all lines
numgrep      - to find numbers matching ranges or sets
numinterval  - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom    - random numbers from ranges or sets, eg odd.  
numrange     - similar to seq
numround     - round numbers up, down or to nearest

より一般的な計算コマンドnumprocess
コマンドラインの式を入力ラインの数値に適用します。

5
Volker Siegel

awkを使用できます。これは、行ごとのパターンでファイルをスキャンおよび処理するのに役立つネイティブLinuxアプリケーションです。あなたの質問に対して、これはあなたが望むものを生成します:

awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt

パイプも受け入れます:

cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
1
gwarah

Perlソリューション:

$ Perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

上記は、複数のファイルにわたるすべての数値を合計できます。

$ Perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

個々のファイルの数値の合計を表示するコマンドラインで指定された複数のファイルの場合、次の操作を実行できます。

$ Perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt
0

これは、bashスクリプトのかなり簡単な使用法です。

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
0
zomfg_zombie

シンプル-

awk '{total+=$1} END{print total}' file

数値を合計し、合計を提供します。

0
Sufyan Ramzan