Extraia números de um arquivo de texto e coloque-os em outro arquivo

0

Eu tenho um arquivo de texto cujo conteúdo é assim:

{"result":"true","last":0.02094,"high":0.0213,"low":0.01682,"avg":0.01871,"sell":0.02094,"buy":0.02054,"vol_ltc":5145.8262,"vol_btc":96.29887,"rate_change_percentage":"23.47"}'

(isto é dados de uma API)

Eu quero formatado para que meu programa possa lê-lo, mas eu preciso extrair os números porque algumas das trocas são formatadas de forma diferente pela API, por exemplo, isto:

{"result":"true","last":"0.00000070","high":"0.00000073","low":"0.00000069","avg":"0.00000071","sell":"0.00000071","buy":"0.00000069","vol_doge":71072621.657,"vol_btc":50.64272,"rate_change_percentage":"0.00"}

(Diferença: cotações em torno de valores de preço)
E eu preciso de algo que se pareça com isso:
(Usando o primeiro)

0.02094
0.0213
0.01682
0.01871
0.02094
0.02054
5145.8262
96.29887
23.47

Como alternativa, algo assim (novamente, usando o primeiro)

last
0.02094
high
0.0213
low
0.01682
avg
0.01871
sell
0.02094
buy
0.02054
vol_ltc
5145.8262
vol_btc
96.29887
rate_change_percentage
23.47

Se precisar de mais exemplos de strings fornecidas pela API, acesse link

    
por 智障的人 06.07.2015 / 22:49

2 respostas

3

Como a API retorna objetos JSON, eu usaria um analisador JSON para ela, combinado com sed e grep.

Eu decidi jq , que está contido no repositório do Ubuntu, para que ele possa ser instalado usando% código%; Eu não sei qual distro você está usando, então você terá que descobrir isso sozinho se quiser usar essa solução.

jq ".[]" <filename> | sed s/\"//g | grep -P '^\d+(\.\d+)$'

Agora, deixe-me dividir isso:

  1. sudo apt-get install jq imprimirá o valor de cada chave no mapa. Isso provavelmente não funciona com mapas aninhados.
  2. jq ".[]" <filename> irá remover a lista de aspas.
  3. sed s/\"//g retornará as linhas que consistem apenas em números inteiros ou decimais.

Esta cadeia de comando irá imprimir o resultado para stdout. Para obtê-lo em um arquivo, basta enviar a saída para ele:

jq ".[]" <filename> | sed s/\"//g | grep -P '^\d+(\.\d+)$' > <other_filename>
    
por 06.07.2015 / 23:29
0

aqui é um perl one-liner:

perl -pe 's/.*?(\d+\.\d+)/$1 . "\n"/eg' file1 > file2
    
por 07.07.2015 / 00:44