imprimir segunda coluna na linha transposta

1

Eu tenho uma tabela separada por espaço (como neste exemplo):

A 101
B 92 102
C 83 93 103
D 74 84 94 104
  ︙

Eu gostaria de obter isso:

  • amostra A com o valor associado e toda a segunda coluna (iniciando no primeiro valor da amostra B) transposta em uma linha
    (em outras palavras, toda a primeira linha, seguida do segundo campo de cada linha subseqüente),
  • amostra B com os valores associados e toda a segunda coluna (iniciando do primeiro valor da amostra C) transposta em uma linha
    (em outras palavras, a segunda linha inteira, seguida pelo segundo campo de cada linha subseqüente),
  • etc.

Estas são as cinco primeiras colunas das primeiras quatro linhas da minha saída:

A 101 92 83 74 …
B 92 102 83 74 …
C 83 93 103 74 …
D 74 84 94 104 …
    
por Ilario Ferrocino 18.02.2015 / 12:14

1 resposta

4
awk '
{
    a[NR]=$0
    b[NR]=$2
}
END{
    for(i=1;i<=NR;i++){
        k=i+1
        printf("%s ",a[i])
        for(j=k;j<=NR;j++)
            printf("%s ",b[j])
        print ""
    }
}' table.file

No primeiro script, são criadas duas matrizes ( a e b ) com NR (número da linha) como índice. De adicionar a cada elemento da matriz a todos os elementos da matriz b mas sem primeiro k ones. Para caso de limitação de memória, o mesmo pode ser feito por meio de dupla passagem de arquivo de entrada:

awk '
NR==FNR{
    b[NR]=$2
    rows=NR
    next
}
{
    printf("%s ",$0)
    for(j=FNR+1;j<=rows;j++)
        printf("%s ",b[j])
    print ""
    }
}' table.file table.file
    
por 18.02.2015 / 13:08