shell - Linux script sort and group without separator -


input given :

10001123 20001234 30002111 40003111 50004000 

requirement:
sort character 2 5
group character 2 5
sum character 6 8
display line character 6 8 > 0

expected output given :

10001357 30002111 40003111 

$ sed -r 's/(.)(....)(...)/\1 \2 \3/' file | awk '{if (!($2 in a))a[$2]=$1; b[$2]+=$3;} end{for (i in b) if (b[i]>0)print a[i],i,b[i];}' | sort -nk2 | sed 's/ //g' 10001357 30002111 40003111 

how works

let's break command parts.

first sed command separates our groups spaces:

$ sed -r 's/(.)(....)(...)/\1 \2 \3/' file 1 0001 123 2 0001 234 3 0002 111 4 0003 111 5 0004 000 

the second part awk summing:

awk '{if (!($2 in a))a[$2]=$1; b[$2]+=$3;} end{for (i in b) if (b[i]>0)print a[i],i,b[i];}' 

the output of awk looks like:

1 0001 357 3 0002 111 4 0003 111 

next sort makes sure our output in desired order:

sort -nk2 

lastly, use sed remove spaces added:

sed 's/ //g' 

note have been done awk. have broken input line parts substr. plain awk, have needed write our own sorting routine or, if gnu awk available, have used builtin sort routine, asort.


Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -