Bash を使用してテキスト ファイル内の数値のリストを合計する
このチュートリアルでは、Bash スクリプトを使用してファイル内の数値のリストを合計する複数の方法について説明します。 最初の方法は paste コマンドを使用するもので、既存のファイルを使用する場合と stdin を使用してファイルを読み取る場合の 2つのケースについて説明します。
最後に、合計を取得するための cut コマンドと awk コマンドについて説明します。
Bash を使用してテキスト ファイル内の数値のリストを合計する
以下で説明するメソッドは、numbers.txt というタイトルの入力ファイルがあることを前提としています。
numbers.txt ファイル:
1
2
3
4
5
6
7
8
9
10
既存のファイルを使用
すべての数値を単純なテキスト ファイルに格納し、各数値を別の行に格納している場合、Bash で次のコマンドを呼び出して合計を取得できます。
指図:
paste -sd+ numbers.txt | bc
出力:
55
stdin を使用 (標準入力)
次のコマンドは、ファイルから読み取り、数値の合計を取得できます。
指図:
cat numbers.txt | paste -sd+ | bc
出力:
55
この場合、コマンド cat numbers.txt を使用してファイルから読み取ります。 このコマンドは、数値のリストを返す他のコマンドに置き換えることができます。
paste には POSIX 定義の仕様がありますが、すべての実装が同じではないことに注意してください。 同じ出力を得るには、Mac OS で次のコマンドを使用する必要があります。
指図:
<cmd> | paste -sd+ - | bc
cut コマンドを使用する
複数の列を持つテキスト ファイルがあり、特定の列の合計を取得したいとします。 cut コマンドを使用してこれを実現できます。
numbers.txt ファイルが次のように定義されているとします。
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
以下のコマンドを使用して、各列を個別に合計できます。
指図:
cat numbers.txt | cut -d ' ' -f 2 | paste -sd+ | bc -l
-f の後の引数は、合計する列番号を表します。 この場合、列番号のカウントは、0 ではなく 1 で始まることに注意してください。
-f フラグに渡された 2 を追加したので、2 番目の列の合計が得られます。
出力:
10
awk コマンドを使用する
作成者にちなんで名付けられた awk コマンドは、以前の方法よりもこのタスクに適しています。 測定すると、awk は以前の方法よりもはるかに優れたパフォーマンスを発揮します。
指図:
awk '{s+=$1} END {print s}' numbers.txt
出力:
55
numbers.txt を数字を含むファイルの名前に置き換えることができます。 これにより、優れたパフォーマンスの一部である cat を介したファイルの読み取りをバイパスすることもできます。