使用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合并操作,然后再将其发送回网络。拥有单个流会更有效率
答案 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]'
请注意在花括号旁边有空格,并在最后一个花括号前加上分号。