$ 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"
}
]
}
]
}
grep
awk
Bashスクリプト(、、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
name
jq
コマンドラインから値が渡される変数。このjq
コードは5つのことを行います。
k
データから目的の配列を抽出します。- 出力したい特定の配列(およびその中のビット)を選択します
p
。 - 出力用の配列を作成します(名前はデータの一部ではないため、挿入する必要があります)。
- 出力を実行するときに特定の区切り文字を挿入します。