web-dev-qa-db-ja.com

forループの合計とカウント

最初の行に番号が付いた5つのファイルがあります。

ファイルの数(カウント)とファイル内の数の合計の両方を計算できるforループを組み込んだbashスクリプトを記述しようとしています。

これは私がこれまでに試みたものです:

for file in $* 
do
        $[head -1 $file] 
        echo $(head -1) 
done

Sumとcount要素をどのように組み込むかはまだわかりません。

1
marzo

あなたがやろうとしていることはこれで達成できると思います:

#!/bin/bash
sum=0
count=0
for file in "$@"
do
        number=$(head -1 "$file")
        count=$((count + 1))
        sum=$((sum + number))
done
echo "The sum of the $count file(s) is: $sum"

変数を追加して、使用しているファイルのsumcountを保存するだけです。その後、ループを実行するたびにcountを増やします。また、number変数にファイルの先頭行にsumを追加します。

3
majesticLSD

これをawkを使用して行うこともでき、ファイルごとにheadを使用する必要がなくなります。

gawk '{count += 1; sum += $1; nextfile} 
      END {printf "count: %d\t sum: %d\n", count, sum}' *

最初のルールは、カウントと合計をインクリメントし、次のファイルにジャンプします。これにより、各ファイルの最初の行以外はすべて無視されます。 ENDでは、数値を出力します。

nextfileはGNUことです。他のバージョンのawkでは機能しない可能性があります。別の方法として、最初の行のみを明示的に機能させることもできます。

awk 'FNR == 1 {count += 1; sum += $1} 
      END {printf "count: %d\t sum: %d\n", count, sum}' *

ただし、残りの行で何もしなくても、ファイルは完全に読み取られます。

2
ilkkachu