次のファイルがあります。
[
{
"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
これは、3つのファイルx.json
、y.json
およびz.json
ここに含まれて参照されている3つの文書を使用して実行できます。
実行するにsh -s
はから直接引っ張りますjq
。