다음과 같은 파일이 있습니다.
[
{
"billingAccountNumber": "x",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "1"
}
},
{
"billingAccountNumber": "y",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "2"
}
},
{
"billingAccountNumber": "z",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "3"
}
}
]
데이터가 정확히 이렇지는 않고 요소가 3개 이상 있습니다. 이 데이터를 기반으로 x.json
, y.json
, 및 3개의 파일을 생성하고 싶습니다 z.json
. 각 파일의 내용을 paymentResponseObject
.
이를 수행할 수 있는 방법이 있습니까 jq
? 에서 이 작업을 수행하는 방법을 알아냈지만 awk
이는 매우 투박하며 다른 모드를 사용하여 이 프로세스를 반복할 수 있기를 바랍니다. awk
각 모드마다 스크립트의 80%를 다시 작성 해야 했습니다 .
답변1
~에서이것따라서 스레드는 다음과 같습니다.
jq -cr 'keys[] as $k | "\($k)\n\(.[$k])"' input.json | while read -r key; do
fname=$(jq --raw-output ".[$key].billingAccountNumber" input.json)
read -r item
printf '%s\n' "$item" > "./$fname"
done
답변2
0.json
이 코드를 사용하여 각 요소를 name 및 1.json
로 저장해 보세요 2.json
. 참고로 배열의 JSON 항목 수에 관계없이 작동합니다.
for i in $(seq $(jq '.|length' sample.json)); do \
j=$( expr $i - 1 ); \
jq ".[$j]" sample.json > $j.json; \
done
설명하다:
다음 줄은 객체 이름을 지정하는 배열의 길이를 찾습니다.
$(seq $(jq '.|length' sample.json))
배열은 0부터 시작하므로 출력 파일 이름을 수정하겠습니다.
j=$( expr $i - 1 );
다음 줄은 json 문서에서 요소를 가져와 파일에 저장합니다.
jq ".[$j]" sample.json > $j.json;
x.json
문자 그대로 , y.json
및 z.json
: 에 저장합니다 .
for i in x y z; do \
jq ".[$count]" sample.json > $i.json; \
count=$( expr $count + 1 ) \
done
답변3
다음 과 같은 jq
쉘 스크립트를 작성하십시오 .
jq -r '.[] |
@sh "cat >\(.billingAccountNumber).json <<\\END",
.paymentResponseObject,
"END"' file.json
이렇게 하면 JSON 문서의 각 최상위 배열 요소를 가져오고 각 요소에 대한 여기 문서 리디렉션 셸이 생성됩니다. cat
쉘이 문서의 내용을 확장하는 것을 방지하기 위해 각 리디렉션이 인용됩니다. 출력은 .billingAccountNumber
의 포맷터에서 참조하는 값으로 명명된 파일로 이동됩니다 .@sh
jq
질문의 데이터가 주어지면 스크립트가 생성됩니다.
cat >'x'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "1"
}
END
cat >'y'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "2"
}
END
cat >'z'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "3"
}
END
sh
이는 세 개의 파일 x.json
, y.json
및 z.json
여기에 포함되고 참조된 세 개의 문서를 사용하여 실행할 수 있습니다 .
실행하려면 sh -s
에서 직접 당기면 됩니다 jq
.