Skip to main content
2 of 5
Added column pretty print.
user avatar
user avatar

If walking the file twice is not a (big) problem (will store only one line in memory):

awk -F : '{printf("%s\t ", $1)}' infile
echo
awk -F : '{printf("%s\t ", $2)}' infile

Which, for a general count of fields would be (which could have many walks of the file):

#!/bin/bash
rowcount=2
for (( i=1; i<=rowcount; i++ )); do
    awk -v i="$i" -F : '{printf("%s\t ", $i)}' infile
    echo
done

But for a really general transpose, this will work:

awk '$0!~/^$/{    split($0,arr,/:/);
                for (j in arr) { out[NR,j]=arr[j]; }
            }
    { if (maxr<j){ maxr=j} }    # max number of output rows.
    END {
        maxc=NR                 # max number of output columns.
        for     (j=1; j<=maxr; j++) {
            for (i=1; i<=maxc; i++) {
                printf( "%s \t", out[i,j])  ### The out field separator.
            }
            printf( "%s\n","" )
        }
    }' infile

And to make it pretty (use : as out filed separator) :

./script | column -t -s :

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6

The code above for a general transpose will store the whole matrix in memory.
That could be a problem for really big files.

user79743