打印元素值时,条件式不能正常工作?

时间:2019-06-02 04:29:45

标签: cmd jq

尝试打印以特定方式格式化的数据,但条件打印无法正常工作。

我写了一个简单的测试:

jq -r ". | if (.[].nickname | length) >15 then \"\(.[].nickname)\t\(.[].fingerprint)\" else \"no\" end" running.json

在其中running.json是此示例json:

[
  {
    "nickname": "FiverInstitute11",
    "fingerprint": "0011BD2J8D3J45D984EC4159C88FC066E5E3300E",
  },
  {
    "nickname": "Something13",
    "fingerprint": "0077BCBA7244DB3E6O2AD274H886170066684887",
  },
  {
    "nickname": "je8gvke8s2ff063CMbc",
    "fingerprint": "00B87ECU71DBF56805NE8469BAF3924A13AD7",
  },
  {
    "nickname": "test931",
    "fingerprint": "00DC112F7D469AD7E0E4B378D050490811BB20E5",
  }
]

即使条件为false,输出也不会打印“否”。有谁知道该如何解决?

1 个答案:

答案 0 :(得分:0)

  1. 样本数据不是完全有效的JSON。在下文中,我假设可以删除多余的逗号。

  2. 管道的第一部分(.)无害,但不是必需的。

  3. 每次出现[。]都会扩展数组,因此当您编写类似if .[] ...的内容时,它就像一个for循环。 因此,您的jq程序实际上在for循环内的for循环内有一个for循环。

也许你是说:

.[]
| if (.nickname | length) > 15 then "\(.nickname)\t\(.fingerprint)" 
  else "no"
  end

调试自己的程序

debug过滤器是有用的调试工具。就像tee /dev/stderr。您可以根据需要使用任意数量,但是在当前情况下,您可以从以下开始:

if (.[].nickname | length) >15 | debug
then "\(.[].nickname)\t\(.[].fingerprint)"
else "no" 
end

当您的程序中需要多个debug时,有时使用如下辅助功能会很有用:

def mydebug(msg): (msg|debug) as $debug | . ;