Skip to main content

awk approach:

awk 'BEGIN{OFS="\t"; print "pos" OFS "COL1"; colname[1]="COL1"; colname[2]="COL2"; colname[3]="COL3";}NR>1{for(i=2;i<=NF;i++) print $1, colname[i-1], $i}' real2.txt

The output:

pos     COL1
18691441        COL1    C
18691441        COL2    A
18691441        COL3    G
18691572        COL1    G
18691572        COL2    C
18691572        COL3    G
18691620        COL1    A
18691620        COL2    T
18691620        COL3    G
18691716        COL1    C
18691716        COL2    G
18691716        COL3    C

OFS="\t" - output field separator

print "pos" OFS "COL1" - prints header line

NR>1 - start processing from 2nd line

for(i=2;i<=NF;i++) print $1, colname[i-1], $i - printing each column (COL...) value "rowwise" regarding to respective pos column value and its corresponding column name.

RomanPerekhrest
  • 30.9k
  • 5
  • 47
  • 68