[CentOS] [OT] Bash help

Wed Oct 25 19:58:34 UTC 2017
Jon LaBadie <jcu at labadie.us>

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)