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

时间:2018-11-29 07:18:03

标签: shell jq

使用jq时如何混合不同的输入源? 对于特定的用例,我想将文件中的一些数据添加到标准输出中通过管道传输的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合并操作,然后再将其发送回网络。拥有单个流会更有效率

2 个答案:

答案 0 :(得分:2)

  

我想将文件中的某些数据添加到标准输出中通过管道传输的Feed中。

有多种方法可以执行此操作,具体取决于外壳以及所使用的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'

更有趣的是:

(cat /tmp/a1 ; cat /tmp/a2) | jq '. + input' 

最后是一种适用于每个jq版本的方法:

jq -s '.[0] + .[1]' <(cat /tmp/a1) /tmp/a2

不过,通常来说,最好避免使用-s选项。

答案 1 :(得分:2)

您可以执行此操作,其中 Traceback (most recent call last): File "cos1.py", line 3, in <module> from scipy.spatial.distance import pdist File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/spatial/__init__.py", line 94, in <module> from .kdtree import * File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/spatial/kdtree.py", line 8, in <module> import scipy.sparse File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/sparse/__init__.py", line 229, in <module> from .csr import * File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 20, in <module> from .compressed import _cs_matrix File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 11, in <module> from scipy._lib._util import _prune_array File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/_lib/_util.py", line 9, in <module> import inspect File "/usr/lib/python2.7/inspect.py", line 37, in <module> import dis File "/home/mayesha/dis.py", line 2, in <module> from scipy.spatial.distance import pdist File "/home/mayesha/venv/local/lib/python2.7/site-packages/scipy/spatial/distance.py", line 119, in <module> from scipy._lib._util import _asarray_validated ImportError: cannot import name _asarray_validated 转发其cat,然后转发stdin

a2

或者这是 compound语句,它将两个单独命令的结果传递到管道中:

<GENERATE a1> | cat - /tmp/a2 | jq --slurp '.[0] + .[1]' 

请注意在花括号旁边有空格,并在最后一个花括号前加上分号。