Anexar n colunas juntas

0

Eu tenho um grande conjunto de dados, que mostra como a variável y muda em função do espaço (x) e do tempo (t). Existem n colunas, cada uma representando um passo de tempo. Eles são delimitados por tabulações.

nota: não há cabeçalhos no arquivo de texto real, eles são apenas adicionados aqui para explicação. Nem deve haver cabeçalhos na saída.

x   y(0)   y(1)    y(2)    y(3) ... y(n)
1   4      4.5     5       5.5  ... 100
2   5      5.5     6       6.5  ... 101
3   7      8       9       10   ... 102
4   10     12      14      16   ... 103

Eu preciso reorganizar meu arquivo para que eu tenha apenas 3 colunas; t, x, y, que devem ser classificados nessa ordem, conforme abaixo.

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
etc

Qualquer ajuda muito apreciada. Eu sinto que isso deveria ser possível usando o awk, mas qualquer solução está bem.

    
por L. Marsden 30.01.2018 / 17:21

3 respostas

2

Solução

GNU awk :

awk '{
         k=NR; x[k]=$1;
         for (i=2; i<=NF; i++) 
             t[i-1][k]=$i 
     }
     END{
         for (i in t) 
             for (j in t[i]) 
                 print i-1, x[j], t[i][j] 
     }' file
  • k=NR - chave crucial que reflete função y valor do eixo ( NR - número do registro)
  • x[k]=$1 - captura valor para o eixo x
  • for (i=2; i<=NF; i++) - iterando os campos a partir do segundo
    • t[i-1][k]=$i - preencha o array de tempo t com função y values

A saída:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
...
    
por 30.01.2018 / 18:08
0

Se você não se importa em fazer um loop pela entrada n times:

n=4   ### your N here
for((t=0; t <= n)); t++))
do 
  awk -F$'\t' -v t=$t '{print t, $1, $(t+2)}' < input
done > output
    
por 30.01.2018 / 18:13
0

Solução alternativa do GNU datamash + awk :

datamash -W transpose <filename \
| awk 'NR==1{ for(i=1; i<=NF; i++) x[i]=$i }
       NR > 1{
           for (i=1; i<=NF; i++) print NR-2, x[i], $i 
       }'

A saída:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
    
por 30.01.2018 / 18:51

Tags