Como posso imprimir linhas ímpares e pares como uma coluna usando o AWK?

1

Eu tenho uma saída de R e preciso imprimir a saída corretamente. Preciso imprimir linhas ímpares e pares como colunas respectivas.

Arquivo original

4             4             4             4             4 
-3.592311e+00 -3.360352e+00 -3.063397e+00 -3.660137e+00  8.053911e+00 
            4             4             4             4             4 
 1.077868e+01 -2.455155e+00  6.214082e+00  5.311552e+00  5.311552e+00
       10            10            10            10            10 
-4.394679e+00 -2.527588e+00  7.716434e+00  5.001199e+00  2.653916e+00 
           10            10            10            10            10 
 3.673181e+00  3.721885e+00  3.464234e+00 -4.363173e-01  6.849429e-01

Saída desejada

    4 -3.592311e+00
    4 -3.360352e+00
    4 -3.063397e+00
    4 -3.660137e+00
    4 8.053911e+00
    4 1.077868e+01
    4 -2.455155e+00
    4 6.214082e+00
    4 5.311552e+00
    4 5.311552e+00
   10 -4.394679e+00
   10 -2.527588e+00
   10 7.716434e+00
   10 5.001199e+00
   10 2.653916e+00 
   10 3.673181e+00
   10 3.721885e+00 
   10 3.464234e+00
   10 -4.363173e-01
   10 6.849429e-01

Eu usei o seguinte código, mas ele não podia me dar o que eu queria

awk '{ for (i = 1; i <= NF; i++) f[i] = f[i] " " $i ; if (NF > n) n = NF } END { for (i = 1; i <= n; i++) sub(/^ */, "", f[i]) ; for (i = 1; i <= n; i++) print f[i] } ' file
    
por Alula 17.01.2017 / 10:20

1 resposta

1

Aqui está uma abordagem do awk, que depende da divisão de linhas pares e ímpares em matrizes apropriadas.

$ awk 'NR%2 !=0 {split($0,col1)}; NR%2 == 0 {split($0,col2); for (i=1;i<=length(col1);i++) print col1[i],col2[i]};' inpu>
4 -3.592311e+00
4 -3.360352e+00
4 -3.063397e+00
4 -3.660137e+00
4 8.053911e+00
4 1.077868e+01
4 -2.455155e+00
4 6.214082e+00
4 5.311552e+00
4 5.311552e+00
10 -4.394679e+00
10 -2.527588e+00
10 7.716434e+00
10 5.001199e+00
10 2.653916e+00
10 3.673181e+00
10 3.721885e+00
10 3.464234e+00
10 -4.363173e-01
10 6.849429e-01

A maneira como isso funciona é bem simples. NR % 2 != 0 nos diz que a linha é ímpar e NR % 2 == 0 é par. Em linhas ímpares, apenas dividimos a linha inteira em array. Em linhas pares, dividimos e imprimimos as duas matrizes por item. Esse processo se repete de maneira alternada até que a última linha seja alcançada.

Isso pode ser melhorado, é claro, o espaço entre colunas pode ser aumentado e tal. A abordagem não é à prova de balas e é adaptada para este caso específico, onde o número de campos é o mesmo em cada linha do arquivo original

    
por 17.01.2017 / 10:48