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

おすすめ記事