perl -F/\\^/ -lanE 'next if $.==1 or !@F; $h{$F[0]}{$F[1]}=$F[2]; $v{$F[1]}++ } {say join ("^", "Name",@w=sort keys %v); say join ("^",$_,@{$h{$_}}{@w}) for sort keys %h' data1.txt