使用awk
它很容易:
awk '{sum[$2] += $1} END {for (i in sum) printf "%4d %s\n", sum[i], i; }'
如果你想用bash
4.x(不是 3.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[@]}
符号在手册的Shell Parameter Expansion部分中进行了描述,甚至在Arrays部分中也没有暗示。如果您知道在哪里查找,信息就在那里。
如果你想处理任意数量的输入文件(就像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
}
这不是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