Awk

如何交換 JSON 文件中的兩個數組元素

  • July 12, 2021

我有這樣的文件

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

我想在每個數組中將第二個數字與第三個數字交換,將其轉換為

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

我該如何使用sed,awk或其他方式做到這一點?

注意第一個和最後一個記錄的存在{}

謝謝

我建議避免使用諸如awkorsed等​​面向文本的工具來解析 JSON 數據…

而是使用 JSON 解析器或依賴於 JSON 庫的語言,如perl,python等。

這是一個例子jq

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

所有對像都替換為第 3 個和第 2 個數組元素的排列。請注意,數組jq以 index 開頭0

比 jq 更冗長的是使用具有可用 JSON 庫的腳本語言:

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

引用自:https://unix.stackexchange.com/questions/474418