使い方awk
は簡単です。
awk '{sum[$2] += $1} END {for (i in sum) printf "%4d %s\n", sum[i], i; }'
bash
(3.xではなく)4.xでそれを実行したい場合は、次のようにします。
declare -A sum
while read number name
do
((sum[$name] += $number))
done
for name in "${!sum[@]}"
do
echo ${sum[$name]} $name
done
ここでの構造は基本的にawk
スクリプトと同形ですが、表記上は少し便利ではありません。名前を連想配列へのインデックスとして使用して、標準入力から読み取りますsum
。${!sum[@]}
表記は、マニュアルの「シェルパラメータ拡張」セクションで説明されており、配列のセクションではほのめかされていません。あなたがどこを見るべきか知っているなら、情報はそこにあります。
awk
(スクリプトのように)任意の数の入力ファイルを処理する場合は、を使用cat
してデータを収集する必要があります。
cat "$@" |
{
declare -A sum
while read number name
do
((sum[$name] += $number))
done
for name in "${!sum[@]}"
do
echo ${sum[$name]} $name
done
}
これは、引数なし(標準入力の読み取り)、1つの引数、または多数の引数を処理するため、UUOCではありません。
すべてのスクリプトについて、出力を番号または名前の順序で並べ替える場合は、スクリプトの出力に適切なものを適用しsort
ます。
script file1 file2 file3 | sort -k 1,1n # By sum increasing order
script file1 file2 file3 | sort -k 1,1nr # By sum decreasing order
script file1 file2 file3 | sort -k 2,2 # By name increasing order
script file1 file2 file3 | sort -k 2,2r # By name decreasing order