Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: jq, как вычесть из объекта массив строк? (JSON)  (Прочитано 994 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Krjd

  • Автор темы
  • Гость
пролистал документацию, если способ и есть, то он мне не ясен
есть объект и массив строк, нужно вычесть из первого второе
a='{
  "5120604": 1,
  "4881854": 2,
  "4762641": 3,
  "3753024": 4,
  "3290543": 5,
  "4102512": 6,
  "4755840": 7,
  "4233936": 8,
  "4287018": 58,
  "4298749": 61
}'

b='[
  "4287018",
  "4298749"
]'
мои потуги:
echo $a | jq 'keys - '"$b"этот вариант не подходит, нужно сохранить второе поле
« Последнее редактирование: 02 Декабря 2015, 11:59:26 от D101101 »

shura1

  • Автор темы
  • Гость
Re: jq, как вычесть из объекта массив строк? (JSON)
« Ответ #1 : 02 Декабря 2015, 12:44:27 »
Очень сложно представить, как это можно сделать в шелл (хотя, разумеется, можно). Все-таки чисто программная задача, на любом ЯП высокого уровня легко решаемая. Допустим, ruby:

Код: (ruby) [Выделить]
require 'json'
require 'set'

a='{
  "5120604": 1,
  "4881854": 2,
  "4762641": 3,
  "3753024": 4,
  "3290543": 5,
  "4102512": 6,
  "4755840": 7,
  "4233936": 8,
  "4287018": 58,
  "4298749": 61
}'

b='[
  "4287018",
  "4298749"
]'

a_hash = JSON.parse a
b_arr  = JSON.parse b

b_set = Set.new b_arr

a_new_hash = a_hash.select {|key, val| !b_set.include? key }

puts JSON.generate(a_new_hash)
« Последнее редактирование: 02 Декабря 2015, 12:51:53 от shura1 »

Krjd

  • Автор темы
  • Гость
Re: jq, как вычесть из объекта массив строк? (JSON)
« Ответ #2 : 02 Декабря 2015, 13:19:44 »
shura1,
не, это не выход
если в шелл я хоть что-то понимаю, то в ruby я не бум бум
если не найдется адекватного решения, то я просто добавлю еще переменную, но данных много и не хочется выделять ресурсы там, где возможно обойтись

shura1

  • Автор темы
  • Гость
Re: jq, как вычесть из объекта массив строк? (JSON)
« Ответ #3 : 02 Декабря 2015, 14:00:04 »
Ну тогда что-то типа
echo "$a" | while read line; do
  num=$(echo "$line" | sed -r 's/.*"([0-9]+)".*/\1/')
  grep -q $num <<<$b  || print $line
done
вроде работает, но на больших объемах это будет чертовски медленно. То есть, если это не предусмотрено в jq, то реально надо или программировать (Руби для примера, можно в Питоне, в Javascript), или же пользоваться json-ориентированными базами данных - загонять в mongodb, допустим, а там уже разбираться. Но, это ИМО не менее сложно, чем программировать и надо делать, если объемы данных в миллионах считаются, ну и постоянно с одними и теми же данными работать надо.

jq - это рельсы. Где дорога проложена, там все едет и работает. А где нет, то никак. Как я понял, можно из одного массива вычесть другой и все.

Пользователь решил продолжить мысль 02 Декабря 2015, 14:07:47:
Да, кстати, jq + awk - можно сделать, чтоб работало быстро и выглядело не очень страшно, но я давненько awk не пользовался. И то же программирование получится.
« Последнее редактирование: 02 Декабря 2015, 14:07:47 от shura1 »

Krjd

  • Автор темы
  • Гость
Re: jq, как вычесть из объекта массив строк? (JSON)
« Ответ #4 : 03 Декабря 2015, 11:42:46 »
как всегда, понял как решить, когда уже не особо надо, хотя может и сяду переделывать
echo $a | jq 'del(.'"$b"')'

 

Страница сгенерирована за 0.089 секунд. Запросов: 23.