Преобразование из поля: формат значения в CSV
У меня есть файл в следующем формате (ну вроде):
RECORD_SEPARATOR
foo: some foo value
bar: another value
baz: 123
RECORD_SEPARATOR
foo: another foo value
bar: yet another value
baz: 345
RECORD_SEPARATOR
foo: a third foo
RECORD_SEPARATOR
bar: a fourth bar
baz: 111
и так далее. Ключевым моментом здесь является то, что не во всех записях присутствуют все поля.
Мой вопрос: что такое супер-простой способ конвертировать эти данные в формат CSV? То есть в моем примере
foo,bar,baz
some foo value,another value,123
another foo value,yet another value,345
a third foo,,
,a fourth bar,111
Конечно, вы можете написать для этого сценарий awk (или perl, или Python), но я надеюсь, что есть что-то уже существующее или какой-то трюк, чтобы сделать его очень коротким.
Примечание: я, конечно, ищу что-то ориентированное на Unix-командную строку.
1 ответ
Решение
Привет с великим Миллером http://johnkerl.org/miller/doc, начиная с
foo: some foo value
bar: another value
baz: 123
foo: another foo value
bar: yet another value
baz: 345
foo: a third foo
bar: a fourth bar
baz: 111
Вы можете запустить
mlr --x2p --ips ": " --barred cat then unsparsify --fill-with "" inputFile
и иметь этот красивый вывод на печать
+-------------------+-------------------+-----+
| foo | bar | baz |
+-------------------+-------------------+-----+
| some foo value | another value | 123 |
| another foo value | yet another value | 345 |
| a third foo | - | - |
| - | a fourth bar | 111 |
+-------------------+-------------------+-----+
Если вы хотите CSV, запустите
mlr --x2c --ips ": " cat then unsparsify --fill-with "" inputFile
и у вас будет
foo,bar,baz
some foo value,another value,123
another foo value,yet another value,345
a third foo,,
,a fourth bar,111