JQ с несколькими входами из разных источников - PullRequest
0 голосов
/ 29 ноября 2018

Как мы можем смешивать разные источники входного сигнала при использовании jq?Для конкретного случая использования я хотел бы добавить некоторые данные из файла в канал, который был конвейером в stdout.

$ echo '[{"a": 1}]' > /tmp/a1
$ echo '[{"a": 2}]' > /tmp/a2
$ jq --slurp '.[0] + .[1]' /tmp/a1 /tmp/a2
[
  {
    "a": 1
  },
  {
    "a": 2
  }
]
$ cat /tmp/a1 | jq --slurp '.[0] + .[1]' /tmp/a2  # Expecting the same result
[
  {
    "a": 2
  }
]

Как вы можете видеть, последняя команда не интерпретировала переданные данные.

Сейчас я вынужден сохранить вывод первой операции во временный файл, чтобы я мог выполнить операцию слияния jq перед отправкой его обратно в сеть.Наличие одного потока было бы намного эффективнее

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы могли бы сделать это, где cat передает его stdin, за которым следует a2:

<GENERATE a1> | cat - /tmp/a2 | jq --slurp '.[0] + .[1]' 

Или это, которое является составным оператором , передающим результатыдве отдельные команды в трубу:

{ <GENERATE a1> ; cat /tmp/a2; } | jq --slurp '.[0] + .[1]' 

Позаботьтесь о том, чтобы рядом с фигурными скобками были пробелы, а перед последней - точка с запятой.

0 голосов
/ 29 ноября 2018

Я хотел бы добавить некоторые данные из файла в канал, который был конвейером в stdout.

Существуют различные способы сделать это, в зависимости от оболочки, а также отверсия JQ, которую вы используете.

Предполагая, что ваш jq поддерживает опцию --argfile, вы можете обнаружить, что это очень удобно:

cat /tmp/a1 | jq --argfile a2 /tmp/a2 '. + $a2'

Вот еще один вариант, который предлагает некоторые другие возможности:

jq -n --argfile a1 <(cat /tmp/a1) --argfile a2 <(cat /tmp/a2) '$a1 + $a2'

Более интересно:

(cat /tmp/a1 ; cat /tmp/a2) | jq '. + input' 

И, наконец, подход, который должен работать для каждой версии jq:

jq -s '.[0] + .[1]' <(cat /tmp/a1) /tmp/a2

В общем, хотя лучше избегать -sопция.

...