この入力が与えられると
{
"attributes": {
"f1": "one",
"f2": "two",
"f3": "three"
}
}
jqコマンドラインから検索してエクスポートするフィールドを指定できるようにしたいです。彼ら値は同じ行にスペースで区切られます。
jq -r 'some-filter' --argjson fields '["f3","f1"]' test.json
結果:three one
jq -r 'some-filter' --argjson fields '["f2"]' test.json
結果:two
私はこのフィルタのいくつかのバリエーションを試しましたが、成功しませんでした。
.attributes
| $fields | . as $f | "\($f)"
答え1
あなたできる試したとおり、変数シンボルバインディングを使用してこれを行います。
jq -r --argjson fields '["f3","f1"]' '[$fields[] as $f | .attributes | .[$f]] | join(" ")' test.json
またはもう少しコンパクトに
jq -r --argjson fields '["f3","f1"]' '[$fields[] as $f | .attributes[$f]] | join(" ")' test.json
しかし、少なくともjq 1.6では$fields[]
イテレータを渡すことができるようです。汎用オブジェクトインデックス形.[<string>]
jq -r --argjson fields '["f3","f1"]' '[.attributes[$fields[]]] | join(" ")' test.json
前任者。
$ jq -r --argjson fields '["f3","f1"]' '[.attributes[$fields[]]] | join(" ")' test.json
three one
$ jq -r --argjson fields '["f2"]' '[.attributes[$fields[]]] | join(" ")' test.json
two
答え2
もしあなたなら本物抽出する値を含むキーを含むJSON配列を渡すには、次の手順を実行します。
jq -r --argjson keys '["f3", "f1"]' '.attributes[$keys[]]' file.json
質問のデータが与えられると、これは次を返します。
three
one
同じ行に配置してスペース区切り記号を使用するには、次のようにします。
jq -r --argjson keys '["f3", "f1"]' '[.attributes[$keys[]]] | join(" ")' file.json
または、最初のコマンドの出力を次にパイプするだけですpaste -d ' ' -s -
。
jq -r --argjson keys '["f3", "f1"]' '.attributes[$keys[]]' file.json |
paste -d ' ' -s -
コマンドユーザーがJSON配列を作成せずに必要なフィールドをより便利に言及できる場合(おそらくキーを正しくエンコードすることを覚えておく必要があります):
jq -r '.attributes[$ARGS.positional[]]' file.json --args f3 f1
またはスペースで区切られた単一行出力バリアントの場合:
jq -r '.attributes[$ARGS.positional[]]' file.json --args f3 f1 |
paste -d ' ' -s -
--args
後続のパラメータはコマンドラインから最後に来る必要があります。