将 jq 输出合并为逗号分隔的字符串,例如

将 jq 输出合并为逗号分隔的字符串,例如

我有这个输出,想将其转换为类似普罗米修斯的格式金泉

cat /tmp/wp-plugin.txt | jq .[]

{
  "name": "akismet",
  "status": "active",
  "update": "none",
  "version": "5.0"
}
{
  "name": "performance-lab",
  "status": "active",
  "update": "none",
  "version": "1.4.0"
}

我的目标是使用 JQ CLI 工具达到这样的效果

wp_plugins{name="akismet",status="active",update="none",version="5.0"}0
wp_plugins{name="performance-lab",status="active",update="active",version="1.4.0"}1

答案1

使用jq

jq -r 'to_entries[] | .key as $k | .value | to_entries | map("\(.key)=\(.value|@json)") | "wp_plugins{\(join(","))}\($k)"' file

或者

jq -r 'to_entries[] | .key as $k | .value | to_entries | "wp_plugins{\(map("\(.key)=\(.value|@json)")|join(","))}\($k)"' file

这将获取原始 JSON 文件,并首先使用to_entries.键将是数组索引,值将是实际对象。

由于我们要创建一个以逗号分隔的键值列表,其中包含不带引号的键和带引号的值,在=每个键和值之间,我们需要处理.value(即对象)。我们通过再次传递它to_entries来获取新的键和值列表来实现这一点。

然后将键和值传递给字符串构造函数,该构造函数以您要查找的格式组成输出,将字符串添加wp_plugins{到逗号分隔列表的开头,将}数组索引附加到末尾。

给出问题中的数据(当数据首先放入数组时)的输出:

wp_plugins{name="akismet",status="active",update="none",version="5.0"}0
wp_plugins{name="performance-lab",status="active",update="none",version="1.4.0"}1

更正后的变体,如果键不是,则0在输出行末尾使用 a ,如果是:updateavailable1available

jq -r '
    to_entries[] |
    (if .value.update == "available" then 1 else 0 end) as $v |
    .value | to_entries |
    map("\(.key)=\(.value|@json)") | join(",") |
    "wp_plugins{\(.)}\($v)"' file

相关内容