首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JQ -逗号过滤器的数据类型是什么?

JQ -逗号过滤器的数据类型是什么?
EN

Stack Overflow用户
提问于 2020-03-01 04:42:34
回答 2查看 308关注 0票数 2

问题

JQ逗号过滤器的数据类型是什么?

背景

当试图输入逗号筛选器的输出时,不能迭代数字错误。

代码语言:javascript
复制
$ printf '{"ika":5,"uni":3}' | jq '.ika, .uni | .'
5
3

$ printf '{"ika":5,"uni":3}' | jq '.ika, .uni | . | add'
jq: error (at <stdin>:0): Cannot iterate over number (5)

若要进行转换,需要显式地转换为数组。

代码语言:javascript
复制
$ printf '{"ika":5,"uni":3}' | jq '[ .ika, .uni ] | . | add'
8

澄清

根据JQ手册,JQ过滤器的输出是(一组空格分隔的JSON数据)。

但是,输出的逗号过滤器(作为基本过滤器之一)似乎不是--一组空格分隔的JSON数据

基本滤波器

逗号: 如果两个过滤器用逗号分隔,那么相同的输入将被输入到这两个过滤器中,并且两个过滤器的输出流将按顺序连接起来:首先,由左表达式产生的所有输出,然后由右产生的所有输出。例如,filter .foo,.bar作为单独的输出生成“foo”字段和“bar”字段。

JQ手册

jq过滤器运行在JSON数据流上。jq的输入被解析为由空格分隔的JSON值的序列,这些值一次通过提供的过滤器传递。过滤器的输出被写入标准输出,同样作为空格分隔的JSON数据序列。重要的是要记住,每个过滤器都有一个输入和一个输出。甚至像“hello”或42这样的文字也是过滤器----它们接受输入,但总是产生与输出相同的文字。将两个过滤器(如加法)组合在一起的操作通常会将相同的输入提供给这两个过滤器并组合结果。

那么,逗号过滤器的输出是什么?如果是如JQ手册所述的JSON数据?我假设,如果它是一个JSON,那么它应该是一个数组吗?

代码语言:javascript
复制
[5, 3]

更新

根据答案:

在jq表达式(如P=Q)中,过滤器Q处理P生成的流中的每一项,每次一次。在调用jq P中,STDIN流中的每一项都由P一次处理。

代码语言:javascript
复制
$ printf '{"ika":5,"uni":3}' | \
jq '.ika, .uni' | \
jq '"JQ is processing the \(input_line_number) th line whose input value is \(.)"'

"JQ is processing the 1 th line whose input value is 5"
"JQ is processing the 2 th line whose input value is 3"

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-01 05:24:40

jq中的逗号表达式采用P, Q形式,与所有jq表达式一样,生成一个JSON值流,在这种情况下,由P生成的流后面跟着由Q生成的流。

这里,"stream“指的是0或更多JSON值的序列,不应与JSON值数组混淆。“JSON值流”本身并不是JSON值。

如果不清楚,你可能会对我的“面向流的jq简介”感兴趣

精化

jq表达式本身并不是“数据类型”,但是每个jq表达式都是一个过滤器,它接受一个JSON值流作为输入,并生成一个JSON值流。使用JSON*表示“一个JSON值流”,可以理解一个流在概念上可以长度无限,我们可以将jq表达式看作是从JSON*到JSON*的映射。

这一点很重要,因为所有的jq表达式都必须从输入的角度来理解。对于P,Q,重要的一点是,如果R是jq表达式,那么:

代码语言:javascript
复制
R | (P,Q)

相当于:

代码语言:javascript
复制
(R|P), (R|Q)

(这是非常重要的一点,首先是因为它使jq非常强大-R实际上是重复的;第二,它使jq管的行为与壳管的表面相似行为有很大不同--例如,bash中的bash。)

-n命令行选项指示应该使用null作为初始JSON值,例如:

代码语言:javascript
复制
jq -n 1,2

生产:

代码语言:javascript
复制
1
2

-s命令行选项

对表单jq P的jq的调用将使STDIN中的每个JSON项在一次的基础上呈现给jq过滤器P。

相反,对表单jq -s P的调用导致STDIN中的项被包装在JSON数组中,然后将其呈现给P。

reduceforeachfoo(P)

jq还支持流的缩减。这对于内置过滤器inputs尤其有用,可以避免使用-s命令行选项来处理外部输入流。

参数化过滤器(例如表单foo(P)的过滤器,其中P是任意的jq表达式)也被支持。

有关详细信息,请参阅jq手册、前面提到的文件和/或其他文档。

票数 3
EN

Stack Overflow用户

发布于 2020-03-01 05:10:16

JQ逗号过滤器的数据类型是什么?

实际上没有逗号过滤器返回的数据类型.

因为它并不真正将值分组在单个容器数据类型中。相反,它通过以下过滤器分别发送值,并在最后分别报告每个输出。

也许理解这个结果的一个好方法是看到这个结果:

代码语言:javascript
复制
$ printf '{"ika":[4,9],"uni":[1,3,5]}' | jq '.ika, .uni | add'
13
9

这两个数组都通过了"add“过滤器,但是每个数组都是独立的,最后报告了两个结果。

重读逗号的文档,你会看到它的意思是:

如果两个过滤器用逗号分隔,那么相同的输入将被输入到中,两个过滤器的输出值流将按照顺序被连接起来的:首先,所有由左表达式产生的输出,然后是由右边产生的所有输出。

您可以将它们转换为数组,但是您需要显式地这样做。例如:

代码语言:javascript
复制
$ printf '{"ika":[4,9],"uni":[1,3,5]}' | jq '[ .ika, .uni | add ]'
[
  13,
  9
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60472049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档