使用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,后续参数必须位于命令行的最后。

相关内容