Под Fedora 30 (Gnome 3.30, X11 ), перезагрузка Gnome Shell, кажется, работает для меня:
Запустить быстрый запуск с помощью<Alt> + <F2>
Введите r
, затем<Enter>
Дождаться перезагрузки оболочки
Каким-то образом это даже заставляет работать некоторые уже запущенные программы, что для меня не имеет смысла...
Самый простой способ создать структуру JSON — использовать утилиту jo
:
$ sed 's/[[:blank:]]\{1,\}/[]=/' file | jo -p
{
"table_name": [
"id",
"col_1",
"col_2"
],
"another_table_name": [
"id",
"col_1"
]
}
Сценарий sed
создает ввод для jo
, заменяя первый набор пробелов или табуляции на []=
. С данными вашего примера это дает
table_name[]=id
table_name[]=col_1
table_name[]=col_2
another_table_name[]=id
another_table_name[]=col_1
Затем утилита jo
позаботится о правильном кодировании данных и создании документа JSON. Перетащите параметр -p
на jo
, если вам нужен компактный вывод.
Старый ответ, использующий вместо этого jq
, но не заботящийся о данных, требующих кодирования JSON:
Предполагая, что никакие данные не нуждаются в специальной кодировке JSON:
jq -n "$(awk '{ printf ".\"%s\" += [\"%s\"] |\n", $1, $2 } END { print "." }' file)"
или
awk '{ printf ".\"%s\" += [\"%s\"] |\n", $1, $2 } END { print "." }' file |
jq -n -f /dev/stdin
Это использует awk
для создания jq
выражений, которые строят ваши массивы. Для данного примера данных выражение jq
будет
."table_name" += ["id"] |
."table_name" += ["col_1"] |
."table_name" += ["col_2"] |
."another_table_name" += ["id"] |
."another_table_name" += ["col_1"] |
.
При оценке с помощью jq
создается документ JSON
{
"table_name": [
"id",
"col_1",
"col_2"
],
"another_table_name": [
"id",
"col_1"
]
}
Добавьте опцию -c
к jq
, чтобы получить компактный вывод.
Использование sed
вместоawk
:
sed -e 's/\([^[:blank:]]*\)[[:blank:]]*\(.*\)/."\1" += ["\2"] |/' \
-e '$ s/$/./' file |
jq -n -f /dev/stdin
Основная идея состоит в том, чтобы запомнить первое поле из предыдущей строки и, если оно совпадает, вывести запятую и второе поле, в противном случае вывести первое и второе поля. Затем обработайте некоторые граничные случаи
awk '$1 == saved { printf(",%s", $2); next ; }
neednl { print ""; }
{ saved=$1 ; neednl=1 ;printf("%s %s",$1,$2) ; }
END { if (neednl) { print "" ; }}'