Converte dados da matriz vertical em dados da matriz horizontal

1

Eu tenho um arquivo com 25 matrizes em um arquivo, e cada matriz tem 128 linhas e 5 colunas. Cada matriz é colocada uma após a outra, de forma vertical. Assim

Entrada de arquivo (arquivo1):

Array1
Array2
Array3
...
Array25

Eu quero colocar cada array de maneira horizontal. Assim (arquivo2)

Array1  Array2  Array3 ... Array25

Eu tentei usar este comando:

pr -25t -w 4000 file1 > file2

Mas não está funcionando como eu quero.

    
por alloppp 08.06.2016 / 04:40

1 resposta

1

Vamos considerar este arquivo de teste com matrizes de 3 linhas cada:

$ cat File
1 2
3 4
5 6
a b
c d
e f
A B
C D
E F

Agora, vamos concatenar as matrizes:

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File
1 2 a b A B 
3 4 c d C D 
5 6 e f E F 

No seu arquivo de dados, existem 128 linhas por matriz. Nesse caso, execute:

awk -v nr=128 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File

Como funciona

  • -v nr=128

    Isso define a variável nr como o número de linhas por matriz.

  • a[NR]=$0

    NR é o número da linha. Nós salvamos cada linha (linha) na matriz a .

  • END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}

    Depois de lermos todas as linhas, elas são gravadas novamente na forma desejada.

    Para fazer isso, fazemos um loop pela variável i , começando com i=1 e terminando com i=nr . Para cada i , imprimimos a nova linha i . Para cada valor i , fazemos um loop sobre j , em que j é o número da linha do arquivo antigo que pertence à linha i do novo arquivo '.

Variação

Embora seja mais difícil para um iniciante ler, uma declaração ternária pode ser usada para dar uma pequena melhora na formatação:

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) for (j=i;j<=NR;j+=nr) printf "%s%s",a[j],(j+nr<=NR?" ":"\n")}' File
1 2 a b A B 11 22
3 4 c d C D 33 44
5 6 e f E F 55 66

j+nr<=NR?" ":"\n" é uma declaração ternária . Retorna um espaço se j+nr<=NR . Caso contrário, retorna uma nova linha.

    
por 08.06.2016 / 07:30