以下を使用しますawk
(Perl または Python を知っている、または学習したい場合を除きます):
awk '{ sum[$1,0] += $2; sum[$1,1] += $3; sum[$1,2] += $4; names[$1] = 1; }
END { for (name in names)
printf "%s %d, %d, %d\n", name, sum[name,0], sum[name,1], sum[name,2];
}' <<EOF
alma-court, 1, 0, 8
alma-court, 4, 2, 24
atlantic-house, 99, 1, 340
diamond, 2, 2, 16
iminds-zuiderpoort, 0, 1, 0
north-plaza, 18, 3, 718
north-plaza, 90, 2, 19
EOF
出力:
iminds-zuiderpoort, 0, 1, 0
alma-court, 5, 2, 32
north-plaza, 108, 5, 737
atlantic-house, 99, 1, 340
diamond, 2, 2, 16
名前を特定の順序で並べたい場合は、出力を並べ替えます。名前には末尾のコンマが含まれているため、印刷形式では名前の後にコンマが追加されないことに注意してください。
純粋なbash
(4.x) 実装
{
declare -A sum
declare -A names
IFS=,
while read name v1 v2 v3
do
names[$name]="$name"
((sum[${name}1] += $v1))
((sum[${name}2] += $v2))
((sum[${name}3] += $v3))
done
for name in "${names[@]}"
do
printf "%s, %d, %d, %d\n" $name ${sum[${name}1]} ${sum[${name}2]} ${sum[${name}3]}
done
} <<EOF
alma-court, 1, 0, 8
alma-court, 4, 2, 24
atlantic-house, 99, 1, 340
diamond, 2, 2, 16
iminds-zuiderpoort, 0, 1, 0
north-plaza, 18, 3, 718
north-plaza, 90, 2, 19
EOF
出力:
diamond, 2, 2, 16
atlantic-house, 99, 1, 340
north-plaza, 108, 5, 737
alma-court, 5, 2, 32
iminds-zuiderpoort, 0, 1, 0
幸いなことに、awk
とbash
スクリプトの出力は同じで、データの並べ替え順序を指定または取得します。
スクリプトは、3.xには存在しない 4.xbash
の機能である連想配列を使用しています。bash
bash