满足条件时终止jq处理

问题描述 投票:0回答:3

我正在使用 jq 在大文件中搜索特定结果。我不关心与此特定条件匹配的重复条目,并且处理整个文件需要一段时间。我想做的是打印有关第一个匹配的一些详细信息,然后终止文件上的 jq 命令以节省时间。

jq '. | if ... then "print something; exit jq" else ... end'

我查看了http://stedolan.github.io/jq/manual/?#Breakingoutofcontrolstructs但这似乎不太适用

编辑: 我正在解析的文件包含多个 json 对象,一个接一个。它们不在数组中。

jq
3个回答
4
投票

这是一种使用最新版本的

first/1
的方法(目前在master中)

def first(g): label $out | g | ., break $out; 

first(inputs | if .=="100" then . else empty end)

示例:

$ seq 1000000000 | jq -M -Rn -f filter.jq

输出(随后立即终止)

"100"

这里我使用

seq
代替大型 JSON 数据集。


3
投票

可以使用 jq 1.4 发布后添加的功能来完成所请求的操作。 以下使用 foreachinputs:

label $top
| foreach inputs as $line
   # state: true means found; false means not yet found
   (false;
    if . then break $top
    else if $line | tostring | test("goodbye") then true else false end
    end;
    if . then $line else empty end
   )

示例:

$ cat << EOF | jq -n -f exit.jq
1
"goodbye"
3
4
EOF

结果: “再见”


2
投票

您可以使用

halt
和内置的
inputs
来完成它:

jq -n 'inputs | if ... then "something", halt else ... end'

将打印

"something"
并在条件匹配时优雅终止。

为了使其工作(即条件为真时终止),

jq
需要
-n
参数。请参阅此问题

© www.soinside.com 2019 - 2024. All rights reserved.