как использовать команду jq для создания таблицы из содержимого файла

#command-line

#командная строка

Вопрос:

Я уже использовал команду grep sed, чтобы сделать что-то ( cat service.yaml | grep -Po '(service_[^:]*|version:. )'| sed -z 's/nversion//g' ), но теперь мне нужно создать «таблицу» содержимого этого файла на выходе следующим образом:

Комментарии:

1. Что yq вы используете? Версия Go или версия Python? После вывода yq --version

2. @Inian yq версия 3.3.2

3. Обратите внимание, что mikefarah yq ( mikefarah.gitbook.io/yq ) — не имеет прямого способа манипулировать результатами в табличном формате, подобном тому, что у вас есть. Существует еще одна версия yq, которую вы можете использовать — github.com/kislyuk/yq который может использовать jq underneath, который может помещать результаты в пользовательские форматы csv или tsv

4. @Inian что вы имеете в виду, в чем разница между 2 ссылками, которые вы переслали? вы имеете в виду, что существует два типа команд yq?

Ответ №1:

Вот вариант решения @ jq170727, который использует только:

  1. переводчик yaml в json; и
  2. jq

Чтобы проиллюстрировать альтернативу yq для (1), я буду использовать npm yaml2json .

 yaml2json service.yaml | jq -r '
  keys_unsorted as $keys
  | (["service", "version", "replica"] | map(""(.)"")),    # quote the headers
    ($keys[] as $k | .[$k] | [$k, .version, .replica])
  | @tsv' 
  

Обратите внимание также, что keys_unsorted используется, в основном, для соблюдения порядка ключей в исходном файле YAML.

Комментарии:

1. спасибо за ваш ответ, но, как я упоминал ранее, у нас есть 2 вида yq cmd, которые создаются разными людьми, и ваш ответ, и решения @jq170727 связаны с этим: github.com/kislyuk/yq которые используют версию, отличную от версии, которую я использую (я использую: mikefarah.gitbook.io / yq ) так что, к сожалению, ваш cmd не работает для меня

2. Мой конкретный ответ избегает yq именно по этой причине, но вы можете заменить любой другой переводчик yaml-to-json, который вам нравится.

Ответ №2:

Вот фильтр, который может помочь

 keys[] as $k | .[$k] | [$k, .version, .replica]
  

Вот пример ее использования. Для справки это yq, который у меня есть из brew

 $ yq --help | grep github
See https://github.com/kislyuk/yq for more information.
and/or https://stedolan.github.io/jq
  

Сначала преобразуйте yaml в json

 $ yq . service.yaml
{
  "service-1": {
    "replica": 2,
    "version": "0.6.24"
  },
  "service-2": {
    "replica": 3,
    "version": "0.21.14"
  }
}
  

Исследуйте объект верхнего уровня

 $ yq . service.yaml 
  | jq -r 'keys'
[
  "service-1",
  "service-2"
]
  

Сгладить в поток массивов

 $ yq . service.yaml 
  | jq -c 'keys[] as $k | .[$k] | [$k, .version, .replica]'
["service-1","0.6.24",2]
["service-2","0.21.14",3]
  

Преобразовать в csv и отформатировать в виде таблицы

 $ yq . service.yaml 
  | jq -cr 'keys[] as $k | .[$k] | [$k, .version, .replica] | @csv' 
  | column -s, -t
"service-1"  "0.6.24"   2
"service-2"  "0.21.14"  3
  

Добавление заголовков

 $ yq . service.yaml 
  | jq -cr 'keys[] as $k | .[$k] | [$k, .version, .replica] | @csv' 
  | (echo '"service","version","replica"'; cat -) 
  | column -s, -t
"service"    "version"  "replica"
"service-1"  "0.6.24"   2
"service-2"  "0.21.14"  3
  

Если вы не хотите заключать строки в кавычки в последних строках, это может быть лучше

 $ yq . service.yaml 
  | jq -cr 'keys[] as $k | .[$k] | "($k),(.version),(.replica)"' 
  | (echo '"service","version","replica"'; cat -) 
  | column -s, -t
"service"  "version"  "replica"
service-1  0.6.24     2
service-2  0.21.14    3
  

Комментарии:

1. большое спасибо за ваш полный ответ, просто есть ошибка: «Ошибка: неизвестная команда «.» для «yq» Запустите «yq —help» для использования. «сервис» «версия» «реплика» ‘

2. и дело в том, что, к сожалению, в соответствии с особенностями моего проекта, преобразование файла .yaml в Json запрещено, поэтому я просто могу использовать опцию ‘read’ для команды ‘yq’

3. Кажется, наши версии yq отличаются — рад, что вы можете адаптировать это для работы с вашей версией.