Cli и JQ, как я могу получить значение свойства после фильтрации с unique_by - PullRequest
2 голосов
/ 03 марта 2020

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

{
  "Jobs":[
     {"JobId": 111, "ArchiveId": 333},
     {"JobId": 112, "ArchiveId": 333},
     {"JobId": 113, "ArchiveId": 2323},
     {"JobId": 114, "ArchiveId": 444}
  ]
}

А вот сценарий оболочки, который смотрит на объект JSON:

count_again=0
jq -r '.Jobs |= unique_by(.ArchiveId)' my-json-archiving.json  \
   | while IFS= read -r job; do
   count_again=$(($count_again + 1))
   echo $job
   echo $count_again
done

Мой первый шаг был отфильтрован любые дубликаты по определенному ключу (.ArchiveId). Как только это будет сделано, я хочу l oop через результат. Ниже приводится то, что у меня есть, основная проблема в том, что он на самом деле читает строку за строкой. Я думаю, что это связано с $job, который я возвращаю.

Я очень новичок в написании сценариев оболочки, поэтому я не уверен, как вернуть объект, который проходит цикл при чтении объекта

1 Ответ

2 голосов
/ 03 марта 2020

Edit # 2

Если вы собираетесь делать больше, чем просто несколько простых вещей с JobId s и ArchiveId s, вы можете рассмотреть возможность сделать это в Python:

import json

with open('my-json-archiving.json', 'r') as fp:
    jobs = json.load(fp)['Jobs']

seen = set()
unique_by_archive_id = [job for job in jobs if job['ArchiveId'] not in seen and not seen.add(job['ArchiveId'])]

for job in unique_by_archive_id:
    job_id = job['JobId']
    archive_id  = job['ArchiveId']
    # do stuff here

Редактировать # 1

Чтобы получить JobId и ArchiveId в качестве переменных, вы можете сделать что-то вроде этого:

jq -r '.Jobs |= unique_by(.ArchiveId) | .Jobs[] | "\(.JobId) \(.ArchiveId)"' \
 my-json-archiving.json | while IFS= read -r line; do
        jobId="$(awk '{print $1}' <<< $line)"
        archiveId="$(awk '{print $2}' <<< $line)"
        echo "Job id: $jobId"
        echo "Archive id: $archiveId"
done

Оригинальный ответ

Я не уверен на 100%, что вы здесь спрашиваете. Если вы хотите получить JobId и ArchiveId от каждой работы, вы можете сделать что-то вроде этого:

$ jq -r '.Jobs |= unique_by(.ArchiveId) | .Jobs[] | "\(.JobId) \(.ArchiveId)"' \
 my-json-archiving.json
111 333
114 444
113 2323

Текст, подобный этому, очень хорошо работает с awk. Например:

$ jq -r '.Jobs |= unique_by(.ArchiveId) | .Jobs[] | "\(.JobId) \(.ArchiveId)"' \
 my-json-archiving.json | awk '{print "JobId:", $1, "ArchiveId:", $2}'
JobId: 111 ArchiveId: 333
JobId: 114 ArchiveId: 444
JobId: 113 ArchiveId: 2323

Аналогичный вопрос: Использование jq для извлечения указанных c значений свойств и вывода в одну строку .

Также можно взглянуть на Справочная страница JQ (man jq). Там много примеров.

...