Awk
如何交換 JSON 文件中的兩個數組元素
我有這樣的文件
{"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
或其他方式做到這一點?注意第一個和最後一個記錄的存在
{
和}
。謝謝
我建議避免使用諸如
awk
orsed
等面向文本的工具來解析 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