ler números com e em awk

-1

Olá, um arquivo com o qual eu estou trabalhando:

   header
//
SeqT: {"POS-s":174.683, "time":0.0130084}
SeqT: {"POS-s":431.49, "time":0.0221447}
[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
absolute:
gthcont: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6 
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

Usando o código do awk

    !body && /^\/\/$/              {body=1}
body  && sub(/^gthcont: */,"") {print > "second_"FILENAME}
body  && /^[01]+/              {print > "third_"FILENAME}
body  && /^\[[0-9]+\]/ {
    print > "first_"FILENAME
    print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}
sub(/^SeqT: {"POS-s":/,"") && sub(/, "time":/," ") && sub(/}$/,"") { print >"fifth_"FILENAME}

Eu preciso que ele seja dividido em cinco arquivos. O primeiro arquivo é

[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);

O segundo arquivo tem que ser

5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6

O próximo arquivo tem que ser

01010010101010101010101010101011111100011
11110100100101010101010101111010001000001
00000000000000011001100101010010101011111

o quarto arquivo deve ter os números de dentro dos colchetes no primeiro arquivo ... neste caso, seria apenas

2.04545e+2
29

e o último arquivo

174.683 0.00130084
431.49 0.0221447 

O código funciona, mas o problema é que ele tem problemas com o uso da notação sci (e + 7 e algo assim) .Nesta linha, não há impressão no arquivo contendo apenas os números do []. Então atualmente o arquivo não se parece com 2.04545e + 2 29 mas apenas

29 ..

como posso ajustar o awk para também ler em notação sci no []?

    
por kagh 26.07.2015 / 15:42

1 resposta

0

Você precisa substituir a expressão regular /^\[[0-9]+\]/ , que corresponde apenas a um ou mais dígitos entre colchetes, com uma expressão regular que corresponda à sua entrada de ponto flutuante.

Por exemplo, tomando a expressão

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

para um número de ponto flutuante com expoente do Números de pontos flutuantes correspondentes com uma expressão regular de Jan Goyvaerts e substituindo-o no seu código awk:

awk 'BEGIN{body=0}
!body && /^\/\/$/    {body=1}
body  && /^\[/       {print > "first_"FILENAME}
body  && /^pos/{$1="";print > "second_"FILENAME}
body  && /^[01]+/    {print > "third_"FILENAME}
body  && /^\[[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\]/ {
  print > "first_"FILENAME
  print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}' file

com o seu exemplo de entrada em file , agora você deve obter

$ cat fourth_file 
2.04545e+2
29
    
por steeldriver 26.07.2015 / 16:06