Alterando várias linhas para uma única linha com espaços no linux

0

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

    
por KumarJohn 13.10.2013 / 02:43

4 respostas

3

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.

    
por 13.10.2013 / 04:58
0

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.

    
por 13.10.2013 / 03:17
0

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" (:).

    
por 18.01.2014 / 16:55
-2

Você também pode usar tr :

tr '\n' ',' filename.txt
    
por 13.10.2013 / 04:31

Tags