Shell 具有来自不同来源的多个输入的jq
在使用jq时,我们如何混合不同的输入源? 对于一个特定的用例,我想将文件中的一些数据添加到stdout中的一个feed中Shell 具有来自不同来源的多个输入的jq,shell,jq,Shell,Jq,在使用jq时,我们如何混合不同的输入源? 对于一个特定的用例,我想将文件中的一些数据添加到stdout中的一个feed中 $ echo '[{"a": 1}]' > /tmp/a1 $ echo '[{"a": 2}]' > /tmp/a2 $ jq --slurp '.[0] + .[1]' /tmp/a1 /tmp/a2 [ { "a": 1 }, { "a": 2 } ] $ cat /tmp/a1 | jq --slurp '.[0] + .[
$ echo '[{"a": 1}]' > /tmp/a1
$ echo '[{"a": 2}]' > /tmp/a2
$ jq --slurp '.[0] + .[1]' /tmp/a1 /tmp/a2
[
{
"a": 1
},
{
"a": 2
}
]
$ cat /tmp/a1 | jq --slurp '.[0] + .[1]' /tmp/a2 # Expecting the same result
[
{
"a": 2
}
]
如您所见,最后一个命令没有解释管道数据
现在,我被迫将第一个操作的输出保存到一个临时文件中,以便在将其发送回网络之前执行jq合并操作。只有一条流会更有效率
我想将文件中的一些数据添加到stdout中的feed中
$ echo '[{"a": 1}]' > /tmp/a1
$ echo '[{"a": 2}]' > /tmp/a2
$ jq --slurp '.[0] + .[1]' /tmp/a1 /tmp/a2
[
{
"a": 1
},
{
"a": 2
}
]
$ cat /tmp/a1 | jq --slurp '.[0] + .[1]' /tmp/a2 # Expecting the same result
[
{
"a": 2
}
]
有多种方法可以做到这一点,具体取决于shell以及您使用的jq版本
假设您的jq支持--argfile选项,您可能会发现这非常合适:
cat /tmp/a1 | jq --argfile a2 /tmp/a2 '. + $a2'
以下是另一种可能的变化:
jq -n --argfile a1 <(cat /tmp/a1) --argfile a2 <(cat /tmp/a2) '$a1 + $a2'
最后是一种适用于jq每个版本的方法:
jq -s '.[0] + .[1]' <(cat /tmp/a1) /tmp/a2
及
您会注意到,前者必须按下k_以存储整个数组[1,2]
,,
而后一个程序只是分别读取两个输入
在第一个程序中,阵列的内存在之后才能释放
所有指向它的指针都已处理,而在第二个程序中,
这是我的记忆。可以在第一次重试后释放。您可以这样做,其中
cat
转发其stdin
,然后是a2
:
<GENERATE a1> | cat - /tmp/a2 | jq --slurp '.[0] + .[1]'
| cat-/tmp/a2 | jq--slurp.[0]+[1]'
或者,这是一个复合语句,将两个单独命令的结果传递到管道中:
{ <GENERATE a1> ; cat /tmp/a2; } | jq --slurp '.[0] + .[1]'
{;cat/tmp/a2;}jq--slurp.[0]+[1]'
注意在花括号旁边留空格,在最后一个括号之前留分号。我试着阅读手册并在线搜索,但找不到任何方法,你给了我4种不同的解决方案。可爱:)为什么最好避免使用
-s
选项?以避免不必要的内存使用。-s
使用的内存是否比+input
?@chepner-我添加了一个关于slurping的注释。或者更简单地说,|jq--slurp'add'-/tmp/a2
。
<GENERATE a1> | cat - /tmp/a2 | jq --slurp '.[0] + .[1]'
{ <GENERATE a1> ; cat /tmp/a2; } | jq --slurp '.[0] + .[1]'