Para imprimir apenas os valores triangulares superiores de acordo com a saída desejada
awk '
NR==1 {
split($0,hdr," "); next
}
{
for (i=NR;i<=NF;i++) {print $1 FS hdr[i] FS $i}
}
' file
snp1 snp1 1
snp1 snp2 0.3
snp1 snp3 0.4
snp1 snp4 0.5
snp2 snp2 1
snp2 snp3 0.4
snp2 snp4 0.5
snp3 snp3 1
snp3 snp4 0.5
snp4 snp4 1
ou equivalentemente, com perl
perl -alne '
if ($. == 1) {
@hdr = @F;
} else {
for $i ($.-1 .. $#F) {
print join " ", $F[0], $hdr[$i], @F[$i];
}
}' file
Se você quiser a matriz completa em vez de apenas o triângulo superior, modifique o índice inicial do loop for
, substituindo NR
(na versão awk) por 2
ou $.-1
(no versão perl) por 1