我想将哈希列表中的特定键输出为行,其中每个外部数组项都由空行分隔。为了说明:
输入是:
[
[
{
"visible": true,
"url": "url-1"
},
{
"visible": true
},
{
"visible": false,
"url": "url-2"
}
],
[
{
"visible": true,
"url": "url-a"
},
{
"visible": true,
"url": null
},
{
"visible": false,
"url": "url-b"
}
]
]
预期输出为:
url-1
url-2
url-a
url-b
现在,我可以使用以下命令获取我想要的输出:
cat input.txt | jq 'walk(if type == "object" then (.url | select( . != null)) end) | .[] | select(length > 0)' | jq 'join("\n")' | jq -rs 'join("\n\n")'
这里有两个问题:
- 选择特定键的值,而不会破坏层次结构并处理潜在的空值(因为键不存在,或者实际上不存在
null
)都由第一次jq
调用处理,因此我们得到了一个字符串列表的列表 - 第二次和第三次调用将其转换为所需的输出,即(原始)字符串列表,其中每个 URL 都有自己的行,并且不同的外部数组条目由空行分隔。
但对于这两个问题似乎应该有一个更简单的解决方案,特别是第二个问题。
这将使用
url
换行符连接子数组的所有元素的字符串,然后使用双换行符连接子数组生成的所有字符串。这会将
null
-valuedurl
字符串视为空字符串,并将输出为空行。为了避免这种情况,您可以在表达式中使用.url // empty
代替 just 。这将清除任何缺失值以及任何 或 这样的值。.url
jq
url
null
false