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
を介したファイルの読み取りをバイパスすることもできます。