Differences between revisions 2 and 3
Revision 2 as of 2008-11-22 14:08:28
Size: 1160
Editor: localhost
Comment: converted to 1.6 markup
Revision 3 as of 2008-11-22 21:58:24
Size: 1168
Editor: GreyCat
Comment: first-line
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
Line 10: Line 11:
Line 11: Line 13:
Line 45: Line 48:

How can group entries (in a file by common prefixes)?

As in, one wants to convert:

    foo: entry1
    bar: entry2
    foo: entry3
    baz: entry4

to

    foo: entry1 entry3
    bar: entry2
    baz: entry4

There are two simple general methods for this:

  1. sort the file, and then iterate over it, collecting entries until the prefix changes, and then print the collected entries with the previous prefix
  2. iterate over the file, collect entries for each prefix in an array indexed by the prefix

A basic implementation of a in bash:

old=xxx ; stuff=
(sort file ; echo xxx) | while read prefix line ; do 
        if [[ $prefix = $old ]] ; then
                stuff="$stuff $line"
        else
                echo "$old: $stuff"
                old="$prefix"
                stuff=
        fi
done 

And a basic implementation of b in awk:

    {
        a[$1] = a[$1] " " $2
    }
    END{
        for (x in a) print x, a[x]
    }

Written out as a shell command:

    awk '{a[$1] = a[$1] " " $2}END{for (x in a) print x, a[x]}' file

BashFAQ/057 (last edited 2012-03-29 20:36:56 by ormaaj)