Сведение массивов строк JSON с помощью JQ

Вероятно, вам нужно приложение "xdotool":

$ xdotool клавиша F2 -для отправки F2 на экран

$ xdotool key 1 -для отправки числа 1 на экран

Другие варианты использования:

http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html

3
13.06.2021, 00:24
2 ответа

Выражение jq

[.a,.b,.c]

извлекает все нужные нам элементы из входных объектов и помещает их в массив. Некоторые из этих элементов могут быть массивами, поэтому нам нужно сгладить все элементы :

.
[.a,.b,.c] | flatten

Для объекта ввода

{
  "a": "arbiter",
  "b": "brisk",
  "c": [
    "cloak",
    "conceal"
  ]
}

это генерирует массив

[
  "arbiter",
  "brisk",
  "cloak",
  "conceal"
]

и вы получите аналогичный, но отдельный массив из второго объекта.

Чтобы объединить эти два массива в один, мы можем просто передать данные через .[], но сокращенный способ записи flatten |.[]flatten[]. Используя это, мы приходим к

[.a,.b,.c] | flatten[]

Резюме:

echo '...as in the question...' |
jq '[.a,.b,.c] | flatten[]'

Если вы хотите дополнительно отсеять какие-либо значения null, отфильтруйте через select(. != null)или извлеките значения, используя [.a//empty,.b//empty,.c//emtpy], или отфильтруйте через map(.//empty)перед flatten[].


В качестве комментария :Ваш ввод JSON создается с помощью простого echoв вопросе. Однако, чтобы правильно создать JSON в командной строке, рассмотрите возможность использования такого инструмента, как jo, который дополнительно кодирует ваши данные для включения в документ JSON :

.

Второй пример JSON можно создать с помощью двух joвызовов

jo a=arbiter b=brisk  'c[]'=cloak  'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider
4
28.07.2021, 11:25

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

> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a,.b,.c[]'

и получаем:

"arbiter"
"brisk"
"cloak"
"conceal"
"astound"
"bistro"
"confer"
"consider"
1
28.07.2021, 11:25

Теги

Похожие вопросы