私は、複数の異なるレベルでjsonから情報を取得し、着信jsonを行ごとのデータに解析する必要があるスクリプトを作成しています。jqを使用してデータを解析しています。
着信jsonは「タスク」の配列です。各タスク[つまり、配列の各要素]は、次のようなオブジェクトです。
{
"inputData": {
"transfers": [
{
"source": {
"directory": "/path/to/source",
"filename": "somefile.mp3"
},
"target": {
"directory": "/path/to/target",
"filename": "somefile.mp3"
}
},
{
"source": {
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delivery>content description</delivery>",
"encoding": "UTF-8"
},
"target": {
"directory": "/path/to/target",
"filename": "somefile.xml"
}
}
]
},
"outputData": {
"transferDuration": "00:00:37:10",
"transferLength": 187813298,
},
"updateDate": "2020-02-21T14:37:18.329Z",
"updateUser": "bob"
}
すべてのタスクを読み、それぞれについて、次のフィールドで構成される1行を出力したいと思います。
task[n].inputData.transfers[].target.filename, task[n].outputData.transferLength, task[n].updateDate
task[].inputData.transfers[]
配列内の複数のエントリの中から「正しい」単一のエントリを選択する場所でも、適切なフィールドを正しく選択する場所にフィルタチェーンがありますが、複数の出力を取得しようとすると単一の要素の場合、チェーンは配列を3回繰り返し、次のようになります。
task[0].inputData.transfers[].target.filename
task[1].inputData.transfers[].target.filename
task[2].inputData.transfers[].target.filename
...
task[n].inputData.transfers[].target.filename
次に、outputData.transferLength
すべての要素
のupdateDate
フィールドの結果、次にすべての要素のフィールドの結果。
これが私のフィルターチェーンです:
'(.tasks[].inputData.transfers[] | select(.target.filename | match("[Xx][Mm][Ll]$")).target.filename), .tasks[].outputData.transferLength, .tasks[].updateDate'
配列の各要素について、これらすべてのマルチレベル要素をグループ化する効率的な方法が必要だと思います。' with ... '句のようなものwith tasks[] : blablabla
、のようなものですが、その方法がわかりません。誰か助けてもらえますか?
私はついに答えを見つけました。トリックは.tasks[]
、パレンがグループとしてフィールド要素の周りに配置された式にパイプすることでした。これにより、パレン内にあるものはすべて、配列の各要素に順番に個別に適用されるようです。次に、@ dmitryの例をガイドとして使用して、要素を右角かっこと左角かっこ内に配置して、選択できる配列要素を再作成します。配列要素は、それぞれ1行に出力できます| @csv
。だから私のために働いた最後のチェーンは:
.task[] | ([.inputData.transfers[].target.filename, .outputData.transferLength, .updateDate]) | [(.[0],.[2],.[3])] | @csv'
残念ながら、私はmatch()
この呼び出しで作業することができませんでしたsub()
。これらのそれぞれにより、jqはコアをダンプする直前に役に立たないエラーメッセージを表示しました。
返信してくれた人に感謝します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加