sed -e 's/,$//' -e '/^[^|]*$/s/$/|/' file.in |
awk -F'[|,]' -vOFS='|' '{ for (i = 2; i <= NF; ++i) { print $1, $i } }'
sed
выполняет предварительную обработку входных данных. Он удаляет конечные запятые в конце каждой строки (-e 's/,$//'
), а если строка не содержит символ вертикальной черты, добавляет ее в конец(-e '/^[^|]*$/s/$/|/'
).
Данные примера преобразуются в следующие с помощью фильтра sed
:
Item1|keys,books,helmet,handle
Item2|Bike
Item3|
Item4|Tyre,brakes,headlight,clamps,rollergrip
Item5|Nails,hammers
Сценарий awk
берет это и интерпретирует каждую строку как набор полей, разделенных вертикальной чертой или запятой(-F'[|,]'
). Затем для каждой входной строки он будет повторно соединять первое поле с каждым из других полей и выводить их. Каждая пара полей в выходных данных разделена вертикальной чертой (-vOFS='|'
).
Результат
Item1|keys
Item1|books
Item1|helmet
Item1|handle
Item2|Bike
Item3|
Item4|Tyre
Item4|brakes
Item4|headlight
Item4|clamps
Item4|rollergrip
Item5|Nails
Item5|hammers
Мне удалось решить эту проблему, передав путь к файлу терминального устройства через http. Вы можете получить этот путь с помощью:tty
$ curl http://my.app/cli?argv=do&argv=something&tty=$(tty)
Тогда нужно просто открыть переданный tty-файл на сервере и прочитать/записать в него вместо STDIN/STDOUT.