我有一系列包含一系列记录的JSON文件,例如
$ cat f1.json
{
"records": [
{"a": 1},
{"a": 3}
]
}
$ cat f2.json
{
"records": [
{"a": 2}
]
}
我想1)从每个记录中提取一个字段,并2)输出包含所有输入文件中所有字段值的单个数组。
第一部分很简单:
jq '.records | map(.a)' f?.json
[
1,
3
]
[
2
]
但是我不知道如何获得jq
来将那些输出数组连接成单个数组!
我没有嫁给jq
;如有必要,我会很高兴使用其他工具。但是我很想知道如何使用jq
来做到这一点,因为这是我一直试图找出的年。
答案 0 :(得分:5)
假设您的jq具有inputs
(在jq 1.5及更高版本中是正确的),则使用它的效率最高,例如遵循以下原则:
jq -n '[inputs.records[].a]' f*.json
答案 1 :(得分:4)
使用-s
(或--slurp
):
jq -s 'map(.records[].a)' f?.json
答案 2 :(得分:2)
如果输入文件很大,那么对文件进行细化处理可能会占用大量内存,在这种情况下,您可以reduce
以迭代方式工作,将数组.a
的内容附加到一个对象时间
jq -n 'reduce inputs.records[].a as $d (.; . += [$d])' f?.json
-n
标志用于确保使用inputs
中可用的数据从头构造输出JSON。 reduce
函数采用.
的初始值,由于输入为空,因此其初始值仅为null
。然后,对于每个输入对象. += [$d]
确保将.a
的数组内容附加到一起。
答案 3 :(得分:1)
您需要使用--slurp
,以便jq
将其过滤器应用于所有输入的汇总,而不是应用于每个输入。使用此选项时,jq
的输入将是您需要考虑的输入数组。
我将使用以下内容:
jq --slurp 'map(.records | map(.a)) | add' f?.json
我们将您当前的变换应用于输入的已打扰数组的每个元素(您以前的单个输入),然后使用add
将这些变换后的数组合并为一个。
答案 4 :(得分:1)
作为$NF
的可读性和awk
的效率之间的折衷,您可以运行--slurp
两次。第一个是原始命令的稍有改动的版本,第二个将未区分的输出合并到单个数组中。
reduce