
Tengo una lista en el siguiente formato:
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
De la lista anterior, necesito generar una lista de la siguiente manera:
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Respuesta1
Esto esmuySimilar aUsando AWK para una matrizy algunas otras preguntas. La idea principal es imprimir cada campo desde el campo dos en adelante en una línea separada precedida por el primer campo.
En este caso, especificamos que el separador de campos es o ,
y ;
también nos aseguramos de no imprimir campos vacíos (hay un campo vacío al final de la primera línea en los datos proporcionados). La OFS
variable que configuramos en la línea de comando -v
es la cadena separadora de salida que se usará para delimitar los campos de salida y NF
es el número de campos en la línea.
awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
Dados los datos de la pregunta, esto genera
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Respuesta2
Esto se puede hacer usando GNU sed así:
sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file
Para cada línea de entrada, elimino la coma final, si la hay, y luego cambio las comas por punto y coma para ayudar con la impresión. Después de eso, estoy ejecutando un bucle de búsqueda y reemplazo, entre :l
y tl
para anteponer el nombre del grupo a cada visitante en la línea de entrada actual.