我有以下 JSON 数据:
{
"Jobs":[
{"JobId": 111, "ArchiveId": 333},
{"JobId": 112, "ArchiveId": 333},
{"JobId": 113, "ArchiveId": 2323},
{"JobId": 114, "ArchiveId": 444}
]
}
这是查看 JSON 对象的 shell 脚本:
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)过滤任何重复项。完成后我想循环遍历结果。下面是我所拥有的,主要问题是它实际上是逐行读取的。我认为这与我返回的 $job
有关。
我对 shell 脚本非常陌生,所以我不确定如何返回在读取对象时循环的对象
最佳答案
编辑#2
如果您要使用 JobId
和 ArchiveId
做的不仅仅是一些简单的事情,您可以考虑在 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
类似问题:Using jq to extract specific property values and output on a single line .
还可以查看 jq 的联机帮助页 (man jq
)。那里有很多例子。
关于bash - cli和jq,如何获取使用unique_by过滤后的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60499649/