Поиск значения ключа в JSON и вывод значения из другого ключа - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующий файл JSON:

{  
   "data":[  
      {  
         "id":"34c4s5f7-175f-480a-adff-d8d0bef4e8c4",
         "name":"test",
         "organizationId":"7er337a-714c-4043-90b1-6a4e7we82d87",
         "isProduction":false,
         "type":"test",
         "clientId":"6d4720062eab494c45ewedaa78de1"
      },
      {  
         "id":"4856a92-9e46-4430-aac7-6ed8674569f",
         "name":"dev",
         "organizationId":"7er337a-714c-4043-90b1-6a4e7we82d87",
         "isProduction":false,
         "type":"sandbox",
         "clientId":"bs34dea7749494daa8deert908bcd9"
      }
   ],
   "total":2
}

Мое требование - найти записи, где имя ключа dev, а затем распечатать ключ идентификатора.

Я встречал

awk -F: '$1~/"name"/{l=$2} l~/dev/ && $1 ~ /id/ {sub(/,/,"",$2);print $2}' 

, но при этом печатается значение ключа, которое появляется в последующих строках для соответствующего ключа.Мне нужно найти значение, которое находится перед соответствующим ключом.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

При разумных допущениях вы, вероятно, могли бы сойти с рук следующее или что-то очень похожее на это:

awk '
  function check() { 
    if (flag && id) {
      sub(".[^:]*:\"","",id); sub(/.,$/,"",id); 
      print id; flag=id="";
    }
  }
  $1 ~ /},?/ { check(); next; }
  /^ *"id":/ { id=$0; next; }
  /^ *"name":"dev"/ {flag=1} '
0 голосов
/ 21 сентября 2018

Использование jq:

jq '.data[] | select(.name == "dev") | .id' file

Используйте параметр -r, если вам нужны необработанные данные (без кавычек).

...