[CentOS] [OT] Bash help
Jon LaBadie
jcu at labadie.us
Wed Oct 25 19:58:34 UTC 2017
On Wed, Oct 25, 2017 at 10:47:12AM -0600, Warren Young wrote:
> On Oct 25, 2017, at 10:02 AM, Mark Haney <mark.haney at neonova.net> wrote:
> >
> > I have a file with two columns 'email' and 'total' like this:
> >
> > me at example.com 20
> > me at example.com 40
> > you at domain.com 100
> > you at domain.com 30
> >
> > I need to get the total number of messages for each email address.
>
> This screams out for associative arrays. (Also called hashes, dictionaries, maps, etc.)
>
> That does limit you to CentOS 7+, or maybe 6+, as I recall. CentOS 5 is definitely out, as that ships Bash 3, which lacks this feature.
>
>
> #!/bin/bash
> declare -A totals
>
> while read line
> do
> IFS="\t " read -r -a elems <<< "$line"
> email=${elems[0]}
> subtotal=${elems[1]}
>
> declare -i n=${totals[$email]}
> n=n+$subtotal
> totals[$email]=$n
> done < stats
>
> for k in "${!totals[@]}"
> do
> printf "%6d %s\n" ${totals[$k]} $k
> done
A slightly different approach written for ksh
but seems to also work with bash 4.
typeset -A arr
while read addr cnt
do
arr[$addr]=$(( ${arr[$addr]:-0} + cnt))
done < ${1}
for a in ${!arr[*]}
do
printf "%6d %s\n" ${arr[$a]} $a
done
Jon
--
Jon H. LaBadie jon at jgcomp.com
11226 South Shore Rd. (703) 787-0688 (H)
Reston, VA 20190 (703) 935-6720 (C)
More information about the CentOS
mailing list