各jq出力に番号を付けます。

各jq出力に番号を付けます。

JSONファイルがあります

{
    "fieldA": {"fieldData": "XYZ"}
    "fieldB": {"fieldData": "PQR"}
    "fieldC": {"fieldData": null}
    "fieldD": {"fieldData": "DEF"}

使ったjq

jq -r 'to_entries[] | if .value.fieldData != null then .key, .value.fieldData else empty end'

次のようにデータを印刷します。

fieldA
XYZ
fieldB
PQR
fieldD
DEF

これでインデックスを取得したいのですが、null値は無視されます。

1
fieldA
XYZ
2
fieldB
PQR
# see the 3rd field is ignored completely and 3 is given for the 4th field.
3
fieldD
DEF

ベストアンサー1

入力JSONドキュメントが有効で、次のように仮定します。

{
   "fieldA": { "fieldData": "XYZ" },
   "fieldB": { "fieldData": "PQR" },
   "fieldC": { "fieldData": null },
   "fieldD": { "fieldData": "DEF" }
}

jqその後、次の値を持つ部分を削除して式を開始できます。fieldDatanull

jq 'map_values(select(.fieldData != null))' file

結果オブジェクトの各キーインデックスにアクセスするには、次のものを使用できます。to_entries 二重そして興味のある他のデータと一緒にそれを抽出します。

$ jq -r 'map_values(select(.fieldData != null)) | to_entries | to_entries | map(.key+1, .value.key, .value.value.fieldData)[]' file
1
fieldA
XYZ
2
fieldB
PQR
3
fieldD
DEF

to_entriesソースオブジェクトのキーインデックスにアクセスするためにこれを2回使用します。

JSONオブジェクトのキーシーケンスが必ずしも固定されているわけではありません。 JSON構造で固定順序が必要な場合は、代わりに配列を使用してください。たぶん良い

[
    { "name": "fieldA", "fieldData": "XYZ" },
    { "name": "fieldB", "fieldData": "PQR" },
    { "name": "fieldC", "fieldData": null },
    { "name": "fieldD", "fieldData": "DEF" }
]

以前の関連質問の元のデータを使用する(チェックにより、配列のjsonからキーと値を取得します。):

jq -r 'map(select(.name != "null")) | to_entries | map(.key+1, .value.name, .value.type)[]'  file

または

jq -r 'map(select(.name != "null") | [.name, .type]) | to_entries | map(.key+1, .value[])[]'  file

これは他の質問に対する私の答えに少し近いです。

to_entries現時点では呼び出しがないため、上記と比較して初期呼び出しがありません。キーのデータしたがって、キー自体を調べる必要はありません。

おすすめ記事