usando o awk para imprimir variáveis em loop

1

Eu sou iniciante no trabalho com o script bash. Eu tenho um arquivo de dados:

i    z    r                    
0   -30   3.5                 
0   -29.5 3.4                 
0   -29   3.6                  
...                             
0    29.5 4.2                  
0    30   4.6                 
1   -30   2.8                  
1   -29.5 3.4                    
....
1    30   5.2
2   -30   2.5
2   -29.5 2.6

Estou tentando reorganizar os dados em um arquivo como este:

i     z     r
0    -30    3.5
1    -30    2.8
2    -30    2.5
...
0    -29.5  3.4
1    -29.5  3.4
2    -29.5  2.6
...

Eu usei o script abaixo, mas ele não pode ser executado como o que eu desejo.

awk '{
  for(z=/-30/; z<=30; z+=0.5){
    for(i=0; i<=17489;i++){
      if(==$i  && ==$z)
        print   
    }
  }
}' data.dat >> avg_SD.dat

por favor me ajude! Muito obrigado.

    
por user297072 23.06.2014 / 11:47

1 resposta

3

A partir do exemplo e do seu script, parece que seu arquivo original é classificado pela primeira coluna ( i ), mas você quer que ele seja classificado principalmente pela segunda coluna ( z ) em vez disso e do que por i .

Isso pode ser alcançado com muito mais facilidade com sort

tail -n +2 data.dat | sort -n -k 2 -k 1 >> avg_SD.dat

Também é provavelmente muito mais rápido do que percorrer dois loops e fazer pelo menos um milhão de comparações para cada linha no arquivo de entrada.

Explicação:

  • tail -n +2 data.dat imprime data.dat iniciando com a segunda linha, removendo o cabeçalho.

  • | redireciona a saída do comando à esquerda para a entrada do comando à direita.

  • sort -n -k 2 -k 1 classifica a entrada numericamente ( -n ), primeiro pelo segundo campo ( -k 2 ) do que pelo primeiro campo ( -k 1 )

  • >> avg_SD.dat imprime a saída em avg_SD.dat mantendo o conteúdo anterior. Se você quiser sobrescrever o conteúdo anterior, use um único > em vez de >> .

Se não houver cabeçalho no arquivo original, você não precisará de tail e poderá passar data.dat diretamente para sort como argumento:

sort -n -k 2 -k 1 data.dat >> avg_SD.dat
    
por Adaephon 23.06.2014 / 13:17