sed -e 's/,$//' -e '/^[^|]*$/s/$/|/' file.in |
awk -F'[|,]' -vOFS='|' '{ for (i = 2; i <= NF; ++i) { print $1, $i } }'
O sed
faz um pouco de pré-processamento dos dados de entrada. Ele remove as vírgulas à direita no final de cada linha ( -e 's/,$//'
) e, se uma linha não contiver um símbolo de pipe, ela adicionará uma ao final ( -e '/^[^|]*$/s/$/|/'
).
Os dados do exemplo são transformados no seguinte pelo filtro sed
:
Item1|keys,books,helmet,handle
Item2|Bike
Item3|
Item4|Tyre,brakes,headlight,clamps,rollergrip
Item5|Nails,hammers
O script awk
leva isso e interpreta cada linha como um conjunto de campos separados por um símbolo de pipe ou uma vírgula ( -F'[|,]'
). Para cada linha de entrada, ela irá emparelhar repetidamente o primeiro campo com cada um dos outros campos e gerá-los. Cada par de campos na saída é separado por um símbolo de pipe ( -vOFS='|'
).
O resultado é
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