
以下のサンプルJSONがあります。
{
"data": [
{
"name": "city",
"LIST": {
"ID": [
{
"value": "ny",
"name": "US"
},
{
"value": "lon",
"name": "GB"
},
{
"value": "Toronto",
"name": "CA"
}
]
}
},
{
"name": "city1"
}
]
}
次の値を取得したい
city,ny
city1,
私はname = "US"の値だけが欲しいですjq
。
配列の各要素の最大値は1 name
= "US"ですdata
。 ="US"がない場合はname
空またはNULLになります。上記の例では、2番目のレコードに= "US"がない場合、出力はまたはにname
なります。city1,blank
city1,
答え1
各data
要素が次のようになるとします。最大.LIST.ID
配列の1つの要素name
は次のとおりですUS
。
jq -r <file '.data[] |
[ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
@csv'
できること:
- 配列のすべての要素を返す(保持)します
data
。 - の各要素に対して、以下を
data
含む2要素配列(CSV書式設定に必要)を作成します。name
各要素data
の属性値- などの配列要素のプロパティ値
value
(そうでない場合は、inを使用して完全に空のフィールドではなくCSV出力から二重引用符で囲まれたフィールドを取得できます)が完全に欠落しています。エラーは発生しません。.LIST.ID
name
US
null
""
null
?
.LIST
.ID
- 結果配列のリストをCSVデータとしてレンダリングします。
答え2
本質的に同じフレイサンの答え.LIST.ID
しかし、配列の要素をオブジェクトに変換できるという事実を活用します。ここでname
値はキー、value
値は対応する値です。
jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file
与えられたサンプルデータを入力として使用すると、次のヘッダーレスCSVデータが生成されます。
"city","ny"
"city1","blank"
データ内の2番目のフィールドが利用できない場合は、// "blank"
式でに変更して空のフィールドを作成します。// null
jq