/tmp/a1 $ echo '[{"a": 2}]-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:00:02 25 4
gpt4 key购买 nike

使用 jq 时如何混合不同的输入源?对于特定用例,我想将文件中的一些数据添加到标准输出中管道的提要中。

$ 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 合并操作。拥有单个流会更加高效

最佳答案

I'd like to add some data from a file into a feed that was pipe in stdout.

有多种方法可以执行此操作,具体取决于 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'

更有趣的是:

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

您可能还希望考虑使用 --slurpfile 选项而不是 --argfile,但请注意 --slurpfile 始终“slurps”文件。

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

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

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

关于吸食的注意事项

如果您比较以下方式产生的输出:

echo '1 2' |
jq -s --debug-dump-disasm --debug-trace '.[0], .[1]'

echo '1 2' |
jq --debug-dump-disasm --debug-trace '., input'

你会注意到前者必须 PUSHK_UNDER 来存储整个数组[1,2],而后一个程序只是分别读取两个输入。

在第一个程序中,数组的内存直到之后才能被释放所有指向它的指针都已被处理,而在第二个程序中,的内存。可以在第一次 RET 后释放。

关于shell - jq 具有来自不同来源的多个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53533697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com