Generar una nueva lista a partir de una existente basada en la primera columna

Generar una nueva lista a partir de una existente basada en la primera columna

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 OFSvariable que configuramos en la línea de comando -ves la cadena separadora de salida que se usará para delimitar los campos de salida y NFes 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 :ly tlpara anteponer el nombre del grupo a cada visitante en la línea de entrada actual.

información relacionada