Como trocar dois campos dentro de um arquivo JSON

0

Eu tenho um arquivo como este

{"100":["0.00001","10","0.01"],
"101":["0.0001","100","0.1"],
"102":["1","1000","1"],
....
"103":["0.01","10000","10"]}

Eu quero trocar o segundo número com o terceiro, dentro do [ ... ].

Convertendo-o em

{"100":["0.00001","0.01","10"],
"101":["0.0001","0.1","100"],
"102":["1","1","1000"],
....
"103":["0.01","10","10000"]}

Como faço isso com sed, awk ou o que for?

Observe a existência de { e } no primeiro e no último registro.

obrigado

    
por SpaceDog 10.10.2018 / 09:04

2 respostas

5

Eu aconselho evitar a análise de dados JSON usando ferramentas orientadas a texto como awk ou sed , etc ...

Em vez disso, use um analisador JSON ou um idioma que dependa de uma biblioteca JSON como perl , python , etc.

Aqui está um exemplo com jq :

<file jq '.[] |= (.[2] as $t | .[2] = .[1] | .[1] = $t)'

Todos os objetos são substituídos pela permutação do terceiro e do segundo elemento do array. Observe que as matrizes em jq começam com o índice 0 .

    
por 10.10.2018 / 10:15
0

Mais verboso que jq seria usar uma linguagem de script que possui bibliotecas JSON disponíveis:

ruby -rjson -e '
    data = JSON.parse File.read ARGV.shift
    data.transform_values! {|v| v[1], v[2] = v[2], v[1]; v}
    puts JSON.pretty_generate data
' file.json
perl -E '
    use Path::Tiny;
    use JSON;
    $json = JSON->new->utf8;
    $data = $json->decode( path(shift)->slurp_utf8 );
    while (($key, $val) = each %$data) {
        ($val->[1], $val->[2]) = ($val->[2], $val->[1]);
        $data->{$key} = $val;
    } 
    $json->canonical->indent;
    say $json->encode($data);
' file.json
    
por 10.10.2018 / 17:44

Tags