Bashスクリプトで解析する方法は? (プラットフォームMIPS)? [コピー]

Bashスクリプトで解析する方法は? (プラットフォームMIPS)? [コピー]
$ curl -LNs "http://urladrescom/content.json" > content.json

コンテンツ.json

{
   "k":[
      {
         "i":1,
         "n":"NAME 1",
         "p":[
            {
               "b":"Event 1",
               "c":"00:00",
               "d":"03:00"
            },
            {
               "b":"Event 2",
               "c":"23:00",
               "d":"00:00"
            }
         ]
      },
      {
         "i":2,
         "n":"NAME 2",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      },
      {
         "i":3,
         "n":"NAME 3",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      }
   ]
}

grepawkBashスクリプト(、、sedなど)(またはBashスクリプトcmdのPython)を使用してイベント1、2、3から「NAME 2」の内容を取得したいと思います。

結果を印刷したいです。

NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

答え1

このPythonを使用して目的のタスクを実行できます。

$ cat parse.py
#!/bin/python

import json
#from pprint import pprint

with open('content.json') as f:
  data = json.load(f)

for dict in data["k"]:
  if (dict["n"] == "NAME 2"):
    for elem in dict["p"]:
      print(dict["n"] + ' \\ ' + elem["b"] + ' \\ ' + elem["c"] + ' \\ ' + elem["d"])

はい

$ ./parse.py
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

答え2

コマンドラインJSONパーサーの使用jq...

これを行うより短い表現があるかもしれませんが、jqこれが私が思いついたものです。

$ jq -r --arg name "NAME 2" '.[][]|select(.n==$name).p[]|[$name,.[]]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

または、よりオプションのコードを使用してSteeldriverの推奨事項に基づく

$ jq -r --arg name "NAME 2" '.k[]|select(.n==$name).p[]|[$name, .b, .c, .d]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

namejqコマンドラインから値が渡される変数。このjqコードは5つのことを行います。

  1. kデータから目的の配列を抽出します。
  2. 出力したい特定の配列(およびその中のビット)を選択しますp
  3. 出力用の配列を作成します(名前はデータの一部ではないため、挿入する必要があります)。
  4. 出力を実行するときに特定の区切り文字を挿入します。

関連情報