jqを使用してコマンドラインで指定されたフィールドを検索する

jqを使用してコマンドラインで指定されたフィールドを検索する

この入力が与えられると

{
  "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後続のパラメータはコマンドラインから最後に来る必要があります。

関連情報