bash - cli和jq,如何获取使用unique_by过滤后的属性值

标签 bash shell command-line-interface jq

我有以下 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

如果您要使用 JobIdArchiveId 做的不仅仅是一些简单的事情,您可以考虑在 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

要获取 JobIdArchiveId 作为变量,您可以执行以下操作:

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% 确定你在这里问的是什么。如果您只想从每个作业中获取 JobIdArchiveId,您可以执行以下操作:

$ 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/

相关文章:

python - 如何在 Python 脚本中调用系统命令时使用 cgi 表单输入作为变量?

c++ - 使用 numericupdown 控制图像的亮度

node.js - NPM 配置列表 : environment configs - REGISTRY

java - 为什么 javac 在我的 IDE 没有时抛出编译错误?

linux - 计算数组 bash 中的出现次数

php - 如何精确获取 PDF Web 链接矩形坐标?

Linux : Shell scripting to known whether it is evening or morning

linux - 如何在Linux命令行的find命令中使用-regex

linux - 发送电子邮件和通知发送在 crontab 中不起作用

linux - 使用 sed 和变量剪切日志文件