
Eu tenho uma lista no seguinte formato:
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
Da lista acima, preciso gerar uma lista da seguinte maneira:
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Responder1
Isso émuitoigual aUsando AWK para um arraye algumas outras perguntas. A ideia principal é imprimir cada campo do campo dois em diante em uma linha separada anexada pelo primeiro campo.
Nesse caso, especificamos que o separador de campo é ou ,
e ;
também nos certificamos de não imprimir campos vazios (há um campo vazio no final da primeira linha nos dados fornecidos). A OFS
variável que definimos na linha de comando -v
é a string separadora de saída que será usada para delimitar os campos de saída e NF
é o número de campos na linha.
awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
Dados os dados da pergunta, isso gera
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Responder2
Isso pode ser feito usando GNU sed assim:
sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file
Para cada linha de entrada, estou excluindo a vírgula final, se houver, e depois trocando vírgulas por ponto-e-vírgula para ajudar na impressão. Depois disso, estou executando um loop de pesquisa e substituição, entre :l
e tl
para preceder o nome do grupo para cada visitante na linha de entrada atual.