Inserindo uma linha em branco depois da mudança no primeiro alfabeto usando awk

0

Estou escrevendo um script em bash para um catálogo de endereços. Tudo está funcionando agora, exceto que não consigo separar registros alfabéticos com uma linha em branco quando o alfabeto muda. Eu tenho um arquivo que após a classificação dá com awk, a saída da seguinte forma:

Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder

Eu quero gerar a saída conforme abaixo:

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

Desejo uma solução usando awk .

    
por Ashok Kanetkar 28.06.2017 / 08:27

4 respostas

3

Use awk para escolher o primeiro caractere da linha de entrada atual. Se for diferente do primeiro caractere da linha anterior, imprima uma linha em branco. Lembre-se do primeiro caractere desta linha e, em seguida, imprima a linha atual. Dessa forma, você obtém uma linha em branco antes de cada linha, se o primeiro caractere for diferente do que estava na linha anterior.

$ awk '{ cur = substr($0,1,1) } NR > 1 && cur != prev { print "" } { prev = cur; print }' file
Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder
    
por 28.06.2017 / 08:40
1

Outra solução awk :

awk 'NR>1 && a && substr($1,1,1)!=a{ print "" }{ a=substr($1,1,1) }1' file
  • substr($1,1,1) - extrair o primeiro caractere do primeiro campo
por 28.06.2017 / 08:53
1
awk '{A[$1]++;if(A[$1]==1){printf("\n")}}1' FS= file
    
por 28.06.2017 / 10:24
0

Nós acumulamos a próxima linha no espaço padrão e comparamos o primeiro caractere do espaço padrão com o primeiro caractere da última linha no espaço padrão.

Quando uma partida, adicionamos mais uma linha no espaço do padrão. Agora, caso cheguemos ao eof, nós imediatamente o comando quit ( N ) faz isso, é por isso que não prefixamos com um $! para aproveitar esse recurso.

Senão, colocamos uma nova linha no final do bloco.

O GNU sed é assumido.

sed -e '
   :a;N
   /^\(.\).*\n[^\n]*$/ba
   h;s/\(.*\n\).*//p
   g;s/.*\(\n\)//;D
' file.txt

Resultados

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder
    
por 03.07.2017 / 08:22