como imprimir uma nova linha no awk

2

Estou tentando imprimir dados coletados de um arquivo em que cada conjunto recebe uma nova linha (\ n)

Código:

awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump2.txt

Saída agora:

mail: [email protected] , fullName: Bogus Bogus, uid: 666  mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667

Saída desejada:

mail: [email protected] , fullName: Bogus Bogus, uid: 666 \n
mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667 \n
    
por brad 02.10.2014 / 12:50

4 respostas

1

tente

 awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt

assumindo que não há% no campo

outra solução

 awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt

assumindo uid: é o último.

    
por 02.10.2014 / 13:01
1

você só precisa adicionar \n no lugar do desejo:

awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt
    
por 02.10.2014 / 12:59
1

Outra técnica: não armazene tudo em uma sequência grande, imprima ao longo da página:

awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt
    
por 02.10.2014 / 15:50
0

Nota: todos os itens abaixo (obviamente) assumem que a linha uid: será sempre o último de cada grupo. No entanto, todos eles trabalham com % caracteres nos dados.

Se você quiser salvar todos os dados e imprimi-los no final, aqui está uma abordagem um pouco simples, usando matrizes:

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt

Se você quiser gerenciar os campos individualmente (no final), use uma matriz bidimensional:

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%s, %s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

(Como a resposta da glenn, isso pressupõe que as strings mail: , fullName: e uid: apareçam como o primeiro campo na linha.)

Eu não sei o que você quis dizer quando mencionou alinhamento, mas, a partir daqui, é fácil alinhar os campos na sua saída:

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

  mail: [email protected],   fullName: Bogus Bogus, uid: 666
 mail: [email protected], fullName: Bogus2 Bogus2, uid: 667
ou
awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

mail: [email protected]  , fullName: Bogus Bogus  , uid: 666
mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667
ou
awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n",
                                    s[i]["mail:"] ",",
                                    s[i]["fullName:"] ",",
                                    s[i]["uid:"]}' dump2.txt

mail: [email protected],  fullName: Bogus Bogus,   uid: 666
mail: [email protected], fullName: Bogus2 Bogus2, uid: 667

Esta resposta mostra como você pode determinar o comprimento máximo de dados para cada campo.

    
por 02.10.2014 / 19:23