Awk

如何用 Bash 腳本解析?(平台 MIPS)?

  • August 20, 2018
$ 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"
           }
        ]
     }
  ]
}

我想使用 Bash 腳本(、、、等)(或 Bash 腳本 cmd 中的 Python)獲取事件 1、2、3 下的“NAME 2”中grepawk內容sed

我想要列印結果:

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

你可以使用這個 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

使用命令行 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

name是一個jq變數,其值在命令行上傳遞。jq程式碼做了五件事:

  1. 提取k我們感興趣的數據中的數組。
  2. 選擇我們要輸出的特定數組(以及其中的p位)。
  3. 創建一個用於輸出的數組(由於名稱不是數據的一部分,因此必須插入它)。
  4. 使用插入的特定分隔符進行輸出。

引用自:https://unix.stackexchange.com/questions/463544