Aqui está uma versão mais curta do perl:
perl -000 -ne 's/\n+/,/g; s/,$//g; print "$_\n"' filename.txt
O -000
ativa o modo de parágrafo, onde várias novas linhas sucessivas definem um registro de entrada.
Tenho dados a seguir com várias linhas
username: joe
empid: 1111
status: resigned
username: tom
emid: 1234
username: kate
empid: 2222
status: resigned
O que eu quero é colocar os dados em outro arquivo como abaixo
username: joe,empid: 1111,status: resigned
username: tom,empid: 1234
username: kate,empid: 2222,status: resigned
Felicidades, KJ
Aqui está uma versão mais curta do perl:
perl -000 -ne 's/\n+/,/g; s/,$//g; print "$_\n"' filename.txt
O -000
ativa o modo de parágrafo, onde várias novas linhas sucessivas definem um registro de entrada.
Eu consegui fazer isso usando
perl -p -e 's/\n/,/' filename.txt | perl -p -e 's/,,/\n/g' | perl -p -e 's/,\Z/\n/g'
O primeiro comando substitui as novas linhas por vírgulas, o segundo coloca a nova linha de volta onde há duas novas linhas antes e a terceira remove o último artefato de vírgula e a substitui por uma nova linha.
Provavelmente é possível fazer tudo isso em um comando, mas não estou familiarizado o suficiente com perl
para fazer isso. O motivo pelo qual eu uso aqui é que sed
não oferece uma solução fácil para substituir novas linhas.
Usando o gawk,
gawk '{s=$1 $2;for(i=3;i<NF;i+=2) {s=s "," $i $(i+1)}print s}' RS= IFS=":" input.txt
Mas observe que isso "come" espaços após o "separador de campo" (:).
Você também pode usar tr
:
tr '\n' ',' filename.txt