【问题标题】:Terminating jq processing when condition is met满足条件时终止jq处理
【发布时间】:2015-07-27 16:20:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的大文件是单个 json 值(例如,数组)还是多个值(一个接一个的对象)?
  • 您能否提供一个更具体的示例来说明您拥有的数据以及您打算如何处理这些数据?
  • 正如 Jeff 所说,如果您提供一些数据样本,那就太好了。考虑到您的用例可能需要使用 --stream 标志,这一点尤其重要,这会大大改变规则并使基本的 jq 操作非常复杂。

标签: jq


【解决方案1】:

这是一种使用最新版本的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 数据集。

【讨论】:

    【解决方案2】:

    使用 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
    

    结果: “再见”

    【讨论】:

      【解决方案3】:

      您可以使用haltinputs 内置函数来完成它:

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

      将打印"something" 并在条件匹配时正常终止。

      为此(即在条件为真时终止),jq 需要 -n 参数。看到这个issue

      【讨论】:

        猜你喜欢
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2022-10-05
        相关资源
        最近更新 更多