Shell 具有来自不同来源的多个输入的jq

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] + .[

在使用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
  }
]
如您所见,最后一个命令没有解释管道数据

现在,我被迫将第一个操作的输出保存到一个临时文件中,以便在将其发送回网络之前执行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]'