Extrair números com awk

0

uma parte de um script no awk se parece com isso

sub(/^Mutation: {"seq-pos":/,"") && sub(/, "time":/," ") && sub(/}$/,"") { print >"fifth_"FILENAME}

O objetivo é que, dada esta entrada:

Mutation: {"seq-pos":0.00030804, "time":0, 0.164494, 1.00723}
Mutation: {"seq-pos":0.176236, "time":0.31516, 0.6876, 1.00723}
Mutation: {"seq-pos":0.224808, "time":0, 0.813626, 1.00723}

Eu posso obter a seguinte saída:

0.00030804 0  0.164494  1.00723
0.17623 0.31516 0.6876 1.00723
0.224808 0 0.813626 1.00723

o código funciona se houver apenas um número depois dele. Como eu precisaria modificar

o script inteiro ...

!body && /^\/\/$/              {body=1}
body  && sub(/^gthcont: */,"") {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
}
sub(/^Mutation: {"seq-pos":/,"") && sub(/, "time":/," ") && sub(/}$/,"") { print >"fifth_"FILENAME}

ify?

    
por kagh 17.08.2015 / 13:03

2 respostas

1

Que tal remover tudo, não sendo um dígito, um ponto ou um espaço?

$ awk '{gsub(/[^0-9. ]/,"")}1' file
 0.00030804 0 0.164494 1.00723
 0.176236 0.31516 0.6876 1.00723
 0.224808 0 0.813626 1.00723

Observe, no entanto, que a análise de um JSON com awk não é uma abordagem muito boa. Você pode usar jq para isso.

    
por fedorqui 17.08.2015 / 13:09
1

Eu sugeriria definir vários separadores de campo (por exemplo, : , , e } ) e, em seguida, selecionar os campos de acordo:

awk 'BEGIN { FS = "[:,}]" } { print $3,$5,$6,$7 } ' 
    
por Fiximan 17.08.2015 / 16:12