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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: jq: добавление элемента во вложенный массив  (Прочитано 757 раз)

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

Оффлайн vento1980

  • Автор темы
  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Знатокам JQ (версия 1.5)...

Есть JSON:
$ echo "${jstr}"
[["123"],["456"]]

Нужно во вложенном массиве (тот который содержит элемент "123") добавить ещё один элемент "789". В результате нужно получить такую структуру:
[["123","789"],["456"]]

Пока удалось добиться этого:
$ echo "${jstr}" | jq --compact-output --arg vl "789" '.[] | select(.[]=="123") | (.+ [$vl])'
["123","789"]

Есть идеи ?

Заранее благодарен!

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: jq: добавление элемента во вложенный массив
« Ответ #1 : 21 Ноября 2018, 21:45:15 »
run.c
#include <stdio.h>
#include <stdlib.h>

int bf = 1024;

int main (int ia, char **ca){
if (ia == 1) return 1;
char *b = malloc (bf+1);
char *c = malloc (bf);
char *d = malloc (bf);
int l,i=atoi(ca[1]);
while (fgets (c,bf,stdin)){
l = sscanf (c,"%[^]]]%[^\n]\n",b,d);
if (l == 2)
printf ("%s , \"%d\"]%s\n",b,i,d);
else
printf ("%s",c);
i++;
}
// puts ("");
free (b); free (c); free (d);
return 0;
}



компилятор
gcc run.c -o run.lnx

запустить ./run.lnx
str="[[\"123\"],[\"456\"]]"
echo "$str" | ./run.lnx 789

вывод терминал.
1:L~/tmp/tar/v$
1:L~/tmp/tar/v$ str="[[\"123\"],[\"456\"]]"
1:L~/tmp/tar/v$ echo "$str" | ./run1.lnx 789
[["123" , "789"],["456"]]
1:L~/tmp/tar/v$

Пользователь добавил сообщение 22 Ноября 2018, 01:06:10:
add=789
echo '[["123"],["456"]]' | sed 's/\(^.*\)\]\(,.*\)/\1,"'"$add"'"\]\2/g'

« Последнее редактирование: 22 Ноября 2018, 01:06:10 от victor00000 »
Wars ~.o

Оффлайн vento1980

  • Автор темы
  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: jq: добавление элемента во вложенный массив
« Ответ #2 : 25 Ноября 2018, 13:12:51 »
Спасибо!

Но я привел простой пример JSON. На самом деле рабочая структура JSON более сложная. Немного усложнив исходные данные, команда перестает работать (она просто добавляет элемент в первый попавшийся массив):

JSON:
v='{"abc":[["wer"]],"def":[["123"],["456"]]}'

Результат:
echo "$v" | ./run.lnx 789
{"abc":[["wer" , "789"]],"def":[["123"],["456"]]}

Хотелось бы добавление значения с условием, что в массиве уже есть какое-то значение.

Наверно, правильно использовать процессор jq. Вот только синтаксис у этого процессора не простой...

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: jq: добавление элемента во вложенный массив
« Ответ #3 : 25 Ноября 2018, 15:08:15 »
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int bf = 1024;

int main (int ia, char **ca){
if (ia == 1) return 1;
char *b = malloc (bf+1);
char *c = malloc (bf);
char *d = malloc (bf);
char *e = malloc (bf);
char *f = malloc (bf);
char *s = strdup (ca[1]);
int l;

while (fgets (c,bf,stdin)){
f [0] = 0;
l = sscanf (c,"%[^]]] ] %[^\n]\n",b,d);
if (l == 2){
sprintf (e,"%s",d);
sprintf (f,"%s]]",b);
} else sprintf (e,"%s",c);

l = sscanf (e,"%[^]]]%[^\n]\n",b,d);
if (l == 2)
printf ("%s%s , \"%s\"]%s\n",f,b,s,d);
else
printf ("%s",c);
}
// puts ("");
free (b); free (c); free (d); free (e);
free (f); free (s);
return 0;
}
« Последнее редактирование: 25 Ноября 2018, 20:23:43 от victor00000 »
Wars ~.o

 

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