Преобразование json в таблицу уценки в bash

Я пытаюсь преобразовать приведенный ниже json в таблицу уценки (документы GitHub (файл .md)), однако не могу этого сделать.

{
   "service_1":"abc-endpoint.vpce.amazonaws.com",
   "service_2":"def-endpoint.vpce.amazonaws.com",
   "service_3":"xyz-endpoint.vpce.amazonaws.com"

}

Команда, которую я пробовал:

cat json_file | jq -r '{"NAME": "ENDPOINT_ID"} + . | to_entries[] | "\(.key)\t\(.value)"'

Вывод, который я получаю:

 NAME         ENDPOINT-ID
service_1    abc-endpoint.vpce.amazonaws.com
service_2    def-endpoint.vpce.amazonaws.com
service_3    xyz-endpoint.vpce.amazonaws.com

Вышеприведенный вывод при фиксации в файле README.md github теряет отступы (пробелы) и неправильно делится на строки и столбцы, что приводит к плохой визуализации.

Ссылка, которую я прошел:

https://www.markdownguide.org/extended-syntax/#tables

Ожидаемый результат:


|    NAME    | ENDPOINT_ID |
| --------   | -------- |
| service_1  | abc-endpoint.vpce.amazonaws.com   |
| service_2  | def-endpoint.vpce.amazonaws.com   |
| service_3  | xyz-endpoint.vpce.amazonaws.com   |

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
156
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Полужестко закодированное решение может выглядеть так:

"|NAME|ENDPOINT_ID|\n|------|------|\n" + 
    (to_entries | map("|\(.key)|\(.value)|") | join("\n"))
  1. Жестко закодированный заголовок + вторая строка
  2. Цикл (map() ) по to_entires для использования key и value
    1. Создайте строку, в которой мы заключаем ключ и значение в |
    2. join() строки с новой строкой (\n)

Выше будет вывод:


|NAME|ENDPOINT_ID|
|------|------|
|service_1|abc-endpoint.vpce.amazonaws.com|
|service_2|def-endpoint.vpce.amazonaws.com|
|service_3|xyz-endpoint.vpce.amazonaws.com|

Что отображается как

ИМЯ ENDPOINT_ID сервис_1 abc-endpoint.vpce.amazonaws.com сервис_2 def-endpoint.vpce.amazonaws.com сервис_3 xyz-endpoint.vpce.amazonaws.com

Демонстрация JqPlay

Чуть менее жестко закодирован, чем ответ @ 0stone0:

% jq -r  '{"NAME": "ENDPOINT_ID"} + {"---": "---"} + . | to_entries[] | "|\(.key)|\(.value)|"'<<-eof                                                                                                   55ms
{
   "service_1":"abc-endpoint.vpce.amazonaws.com",
   "service_2":"def-endpoint.vpce.amazonaws.com",
   "service_3":"xyz-endpoint.vpce.amazonaws.com"

}
eof

Дает мне:

|NAME|ENDPOINT_ID|
|---|---|
|service_1|abc-endpoint.vpce.amazonaws.com|
|service_2|def-endpoint.vpce.amazonaws.com|
|service_3|xyz-endpoint.vpce.amazonaws.com|

Выглядит правильно в предварительном просмотре github:

Не уверен, как это «менее жестко закодировано» xD

0stone0 17.04.2023 17:27

Я не хочу сказать, что это существенная разница или лучше, но вы объединили форматирование с данными в строках заголовка и разделителя, в то время как у меня есть только символы новой строки и символы вертикальной черты на этапе форматирования.

erik258 17.04.2023 18:01

О нет, я не читал это так, просто из любопытства я начал с решения, подобного вашему, но, поскольку оно оставляет завершающую новую строку, я пошел по пути map/join. Спасибо за разъяснение кстати ;)

0stone0 17.04.2023 22:27

преобразовать вывод jq в csv, а затем отобразить результат с помощью утилиты csview

$ cat json_file |jq -r '{"NAME": "ENDPOINT_ID"} + . |to_entries[] | [.key, .value] | @csv' |csview -s Markdown

| NAME      | ENDPOINT_ID                     |
|-----------|---------------------------------|
| service_1 | abc-endpoint.vpce.amazonaws.com |
| service_2 | def-endpoint.vpce.amazonaws.com |
| service_3 | xyz-endpoint.vpce.amazonaws.com |

Другие вопросы по теме