[英]Pretty-print valid JSONs mixed with string keys
我有一個 Redis hash 鍵和值,如字符串鍵 - 序列化 JSON 值。 相應的 rediscli 查詢 (hgetall some_redis_hash) 被轉儲到文件中:
redis_key1
{"value1__key1": "value1__value1", "value1__key2": "value1__value2" ...}
redis_key2
{"value2__key1": "value2__value1", "value2__key2": "value2__value2" ...}
...
and so on.
所以問題是,我如何漂亮地打印括號中的這些值? (請注意,如果您嘗試解析整個文件,則之間的鍵字符串會使文檔無效)首先想到的是從 Redis 中獲取特定的對,剝離寄生蟲鍵,並在剩余的有效 JSON 上使用 jq,如下所示:
rediscli hget some_redis_hash redis_key1 > file && tail -n +2 file
- file now contains valid JSON as value, the first string representing Redis key is stripped by tail -
cat file | jq
- produces pretty-printed value -
所以問題是,如何在沒有這種預處理的情況下進行漂亮的打印? 或者(在這種特殊情況下會更好)如何在一個大的 JSON 中合並鍵和值,其中 Redis 鍵可以在上層訪問,然后是它們的值的字典? 像那樣:
rediscli hgetall some_redis_hash > file
cat file | cool_parser
- prints { "redis_key1": {"value1__key1": "value1__value1", ...}, "redis_key2": ... }
進行漂亮打印的簡單方法如下:
cat file | jq --raw-input --raw-output '. as $raw | try fromjson catch $raw'
它嘗試使用 fromjson 將每一行解析為fromjson
,如果不能,則僅輸出原始行(使用$raw
)。
( --raw-input
在那里,因此我們可以調用包含在try
中的fromjson
而不是直接在每一行上運行它,並且--raw-output
在那里,因此任何非 json 行都不會被包含在output。)
僅使用 jq 的問題第二部分的解決方案:
cat file \
| jq --raw-input --null-input '[inputs] | _nwise(2) | {(.[0]): .[1] | fromjson}' \
| jq --null-input '[inputs] | add'
--null-input
結合[inputs]
將整個輸入生成為一個數組_nwise(2)
然后分成兩組(更多信息關於_nwise
){(.[0]): .[1] | fromjson}
{(.[0]): .[1] | fromjson}
然后轉換成一個 json 列表| jq --null-input '[inputs] | add'
| jq --null-input '[inputs] | add'
| jq --null-input '[inputs] | add'
然后組合成一個 json或者在單個 jq 調用中:
cat file | jq --raw-input --null-input \
'[ [inputs] | _nwise(2) | {(.[0]): .[1] | fromjson} ] | add'
...但是到那時,您最好編寫一個更易於理解的 python 腳本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.