尝试打印以特定方式格式化的数据,但条件打印无法正常工作。
我写了一个简单的测试:
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,输出也不会打印“否”。有谁知道该如何解决?
答案 0 :(得分:0)
样本数据不是完全有效的JSON。在下文中,我假设可以删除多余的逗号。
管道的第一部分(.
)无害,但不是必需的。
每次出现[。]都会扩展数组,因此当您编写类似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 | . ;