$ awk -v OFS=',' '/^die$/ { print substr(lines,2); lines=""; next } { lines=lines OFS $0 }' file
john doe,555-666-333,[email protected]
jane doe,Beverly Hills,444-333-111,[email protected]
A mesma coisa se aplica aos dados que contêm vírgulas (veja o final da minha resposta abaixo). Se os dados contiverem vírgulas, convém usar isto:
awk -v OFS=',' '
/^die$/ { print substr(lines,2); lines=""; next }
/,/ { $0=sprintf("\"%s\"", $0 ) }
{ lines=lines OFS $0 }' file
O código cria uma string em lines
, que é delimitada por OFS
(uma vírgula). Quando a palavra die
é encontrada sozinha em uma linha, a sequência em lines
é gerada. Tho substr()
call remove a vírgula que foi adicionada na frente da linha quando o primeiro campo do registro foi anexado à string. As linhas com vírgulas são tratadas da mesma maneira que no meu código abaixo.
Usando o GNU awk
ou mawk
, mas não o BSD awk
, você também pode fazer
mawk -v RS='\ndie\n' -v FS='\n' -v ORS='\n' -v OFS=',' '{$1=$1;print}' file
Isso não produziria campos citados para dados que contenham vírgulas.
O $1=$1
força awk
a reconfigurar o registro de acordo com as variáveis OFS
(separador de campo de saída) e ORS
(separador de registro de saída) antes da saída.
Responder antes de atualizar para pergunta:
paste -d, - - - - <file
Isso produziria
john doe,555-666-333,[email protected],die
jane doe,444-333-111,[email protected],die
Para remover as linhas die
(estas são totalmente desnecessárias):
paste -d, - - - - <file | cut -d, -f 1-3
Os trabalhos acima funcionarão se os dados originais não contiverem vírgulas.
Você também pode filtrar as linhas die
desde o início:
sed '/^die$/d' file | paste -d, - - -
Isso funcionaria mesmo se os dados originais contivessem vírgulas.
Se os dados contiverem vírgulas, convém pré-processá-lo para adicionar citações em torno dessas linhas:
awk '/^die$/ { next } /,/ { $0=sprintf("\"%s\"", $0 ) } 1' file | paste -d, - - -
Dado o arquivo
john doe
555-666-333
[email protected]
die
jane doe
444-333-111
[email protected]
die
Me, myself and I
000-000-000
[email protected]
esse último comando geraria
john doe,555-666-333,[email protected]
jane doe,444-333-111,[email protected]
"Me, myself and I",000-000-000,[email protected]