Search code examples
awktranspose

transpose a file using a key field in awk


I want to use awk to transpose a file over a group field. Tks

I have a file like this.

id  Name    Value

1 B1 0.1

1 B2 0.3

1 B3 0.4

2 B1 0.2

2 B2 0.09

2 B3 0.10

I want a file like this:

   B1 B2 B3
 1 0.1 0.3 0.4
 2 0.2 0.09 0.10

Solution

  • $ cat tst.awk
    BEGIN { OFS="\t" }
    NR==1 { next }
    (prev != "") && ($1 != prev) {
        if (++nr == 1) {
            print hdr
            rec = prev rec
        }
        print rec
        hdr = ""
        rec = $1
    }
    {
        hdr = hdr OFS $2
        rec = rec OFS $3
        prev = $1
    }
    END { print rec }
    
    $ awk -f tst.awk file
            B1      B2      B3
    1       0.1     0.3     0.4
    2       0.2     0.09    0.10