이런 파일이 있어요
{"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
사용 jq
및 reverse
기능:
jq '.[][1:] |= reverse' file.json
또는
jq '.[][-2:] |= reverse' file.json
이 표현식은 .[][1:]
문서에 있는 각 배열의 첫 번째 요소( .[][-2:]
각 배열의 마지막 두 요소가 명시적으로 선택됨)를 제외한 모든 요소를 포함하는 조각을 선택합니다. 를 사용하여 이를 되돌릴 수 있습니다 reverse
.
아마도 더 간단한 접근 방식은 다음과 같습니다.
올바른 순서로 요소를 선택하여 원하는 순서로 배열을 명시적으로 다시 작성합니다.
jq 'map_values([ .[0], .[2], .[1] ])' file.json
이렇게 하면 원래 배열의 요소를 사용하여 선택한 순서대로 각 배열이 다시 생성됩니다.