Фильтрация одного ключа со значением другого ключа в jq - PullRequest
0 голосов
/ 03 марта 2020

У меня есть список данных пакета в формате JSON, который выглядит следующим образом:

[
  {
    "Package": "pyasn1",
    "Version": "0.4.6",
    "DownloadURL": "https://files.pythonhosted.org/packages/3d/50/5ce5dbe42eaf016cb9b062caf6d0f38018454756d4feb467de3e29431dae/pyasn1-0.4.6-py2.4.egg"
  },
  {
    "Package": "cachetools",
    "Version": "3.1.1",
    "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
  }
]

И я хотел бы создать список элементов, где .DownloadURL не содержит строка в .Version.

Я пробовал это, но это не похоже на работу:

jq '.[]|select(.DownloadURL | contains(.Version)| not)'

Я получаю следующую ошибку:

jq: error (at <stdin>:11): Cannot index string with string "Version"
exit status 5

Я смог сделать следующее ...

jq '.[]|select(.DownloadURL | contains("0.4.6")| not)'

... и это дало ожидаемые результаты:

{
  "Package": "cachetools",
  "Version": "3.1.1",
  "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
}

Есть ли способ использовать содержимое .Version с функцией contains() или есть лучший способ сделать это? Я установил игровую площадку с данными здесь .

Спасибо!

Ответы [ 2 ]

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

У меня сработало следующее:

jq '.[]|.Version as $v|select(.DownloadURL | contains($v)| not)'
{
  "Package": "cachetools",
  "Version": "3.1.1",
  "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
}

Является ли результат

1 голос
/ 03 марта 2020

Я хотел бы создать список элементов, в котором .DownloadURL не содержит строку в .Version.

Если, как вы говорите, вы хотите получить результат в виде списка, вы можете использовать map:

map(select( .Version as $v | .DownloadURL | contains($v) | not))

Однако семантика contains очень сложна, поэтому вы можете sh рассмотреть возможность использования index вместо:

map(select( .Version as $v | .DownloadURL | index($v) | not))
...