Monday, March 10, 2008

Sort based on two fields, merge 3rd fields:AWK


$ cat out3.txt
id1|/usr|user1
id2|/root|user5
id1|/usr|user2
id2|/root|user9
id3|/root|user8
id1|/usr|user3

Output required:
-------------------
id1|/usr|user1,user2,user3
id3|/root|user8
id2|/root|user5,user9

i.e.

- sort based on values of 1st and 2nd fields
- get all the corresponding 3rd fields together (comma separated)


$ awk -F "|" '{Arr[$1"|"$2]=sprintf("%s,%s",Arr[$1"|"$2],$3)} END {for ( i in Arr) {printf("%s|%s\n",i,Arr[i])}}' out3.txt | sed 's/|,/|/' > out3.txt.tmp

$ cat out3.txt.tmp
id3|/root|user8
id2|/root|user5,user9
id1|/usr|user1,user2,user3


Another solution:

$ awk 'BEGIN {FS = OFS = "|"}
!arr[$1$2] {arr[$1$2] = $0; next}
{arr[$1$2] = arr[$1$2] "," $3}
END {for(i in arr) {print arr[i]}}
' out3.txt > out3.txt.tmp


$ cat out3.txt.tmp
id1|/usr|user1,user2,user3
id3|/root|user8
id2|/root|user5,user9

No comments:

© Jadu Saikia www.UNIXCL.com