Как получить значения вложенного ключа из файла JSON в Bash, используя Python One-Liner? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь получить значения вложенного ключа из файла json в bash, используя однострочную строку python.Ниже дано содержимое моего файла json.

{
    "conditional_ks": {
     "saturday":["reportdata_by_type"],
     "sunday":["rt_report","metadata"]
    }
}

Я хочу, чтобы все значения ["reportdata_by_type", "rt_report", "metadata"] в виде списка.Мне понравилось,

[root@testnode1 repair]# python -c "import json; print json.load(open('repair.json','r'))[\"conditional_ks\"].values()"

output: [[u'rt_report', u'metadata'], [u'reportdata_by_type']]

, но мне нужны выходные данные, такие как ['rt_report', 'metadata', 'reportdata_by_type']

Примечание: repair.json is jsonимя файла.

одна опция использует conditional_ks.*[], который должен выдавать вывод, например:

 ["reportdata_by_type", "rt_report", "metadata" ]

Но в bash я не могу его использовать.

МожетУ кого-нибудь есть решение, пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

как показано ниже, я решил проблему:

python -c "import json; print reduce(lambda x,y: x+y,json.load(open('repair.json','r'))[\"conditional_ks\"].values())"

вывод: [u'rt_report', u'metadata', u'reportdata_by_type']

0 голосов
/ 06 февраля 2019

Как всегда, jq - это инструмент для работы с json из командной строки:

$ jq '.conditional_ks.saturday + .conditional_ks.sunday' repair.json
[
  "reportdata_by_type",
  "rt_report",
  "metadata"
]

Редактировать: если ваши реальные данные имеют больше полей, чем простоэти два конкретных, и вы хотите объединить все значения полей conditional_ks, тогда:

$ jq '[ .conditional_ks[] ] | flatten' repair.json

сделает свое дело.

0 голосов
/ 06 февраля 2019

Попробуйте следовать сценарию.$ 1 - это ваш файл json, например

./MyScript.sh 'PathToYourJsonFile'

MyScript.sh:

#!/bin/bash

content=$(cat "$1");
string="";

echo "[";
while read line; do

  split=$(echo $line | sed -e 's/.*\[\(.*\)\]/\1/' | sed -s 's/",/" /g');

  for i in $split; do
    echo "$i,"
  done

done< <(echo -n "$content" | grep "\:\[");

echo "]";

Результат:

[
"reportdata_by_type",
"rt_report",
"metadata",
]
0 голосов
/ 06 февраля 2019
python -c "import json; import itertools; print(list(itertools.chain(*(json.load(open(\"repair.json\", 'r'))[\"conditional_ks\"].values()))))"

Я проверил код на моем компьютере, и он работает правильно.Может ли это быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...