awkを使用してループ値を合計するのに問題があります。

awkを使用してループ値を合計するのに問題があります。

スクリプトの終わりを反映するために合計を取得しようとしていますが、36962正しく機能しません。$TOTALどんな提案がありますか?これは学校のプロジェクトで、私は初めてBashに触れました。

TOTAL=0
while read p; do
    awk '{ if ($1 > 100 ) print TOTAL+=$1}'
    echo $TOTAL
done < ipuniq.txt
  • 6578
  • 6723
  • 32735
  • 36962
  • エコ -> 0

ベストアンサー1

このTOTAL変数はシェル変数なので、awk不明です。awkコマンドでは、TOTAL変数は繰り返されるたびに設定されないため、毎回単一の値にリセットされ、印刷されます。

awkさらに、このようなループに使用するのは無意味です。

awk次の1つのパッドを使用して直接これを実行できます。

awk '$1 > 100 { total+=$1 } END { print total }' ipuniq.txt

ループや他のコマンドは必要ありません。


ただし、課題にbash / shellを使用する必要がある場合は、次のようにします。

total=0
while read -r p _; do
    ((p>100)) && total=$((total+p))
done < ipuniq.txt
echo "$total"

これはシェル算術式を使用して値がp100より大きいことを確認し、その場合に追加しますtotal

-rまた、注:このオプションをコマンドに追加したのは、readバックスラッシュを文字通り印刷するためです。 (ユースケースには必要ありませんが、-rこの方法を使用しない特別な理由がない限り、常に使用することをお勧めします。)

また、不要な入力に設定されないよう _にパラメータ名を追加しました。残りのすべての単語を最後のパラメータに割り当てるので、ファイルに数字とIPが含まれているとします。例:pread

1 10.10.10.10
2 10.10.10.11

問題をキャプチャするパラメータがない場合は、p次のように設定されます。

p='1 10.10.10.10'

それから:

p='2 10.10.10.11'

おすすめ記事