JSON 파일에서 두 배열 요소를 바꾸는 방법

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?

{첫 번째 기록과 마지막 기록에 중화가 존재하는지 확인하세요 .}

감사해요

답변1

JSON 데이터를 구문 분석하는 데 텍스트 중심 도구(예 awk: 등) 를 사용하지 않는 것이 좋습니다 .sed

대신 JSON 파서나 JSON 라이브러리에 의존하는 언어(예 : perl.python

예는 다음과 같습니다 jq.

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

모든 객체는 세 번째 및 두 번째 배열 요소의 순열로 대체됩니다. 의 배열은 jq인덱스로 시작합니다 0.

답변2

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

답변3

사용 jqreverse기능:

jq '.[][1:] |= reverse' file.json

또는

jq '.[][-2:] |= reverse' file.json

이 표현식은 .[][1:]문서에 있는 각 배열의 첫 번째 요소( .[][-2:]각 배열의 마지막 두 요소가 명시적으로 선택됨)를 제외한 모든 요소를 ​​포함하는 조각을 선택합니다. 를 사용하여 이를 되돌릴 수 있습니다 reverse.

아마도 더 간단한 접근 방식은 다음과 같습니다.

올바른 순서로 요소를 선택하여 원하는 순서로 배열을 명시적으로 다시 작성합니다.

jq 'map_values([ .[0], .[2], .[1] ])' file.json

이렇게 하면 원래 배열의 요소를 사용하여 선택한 순서대로 각 배열이 다시 생성됩니다.

관련 정보