JSON 배열을 여러 파일로 분할

JSON 배열을 여러 파일로 분할

다음과 같은 파일이 있습니다.

[
  {
    "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.jsonz.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의 포맷터에서 참조하는 값으로 명명된 파일로 이동됩니다 .@shjq

질문의 데이터가 주어지면 스크립트가 생성됩니다.

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.jsonz.json여기에 포함되고 참조된 세 개의 문서를 사용하여 실행할 수 있습니다 .

실행하려면 sh -s에서 직접 당기면 됩니다 jq.

관련 정보