Precisa de um comando / script que possa gerar saída em uma única linha com todas as informações necessárias

2

Por favor, ajude como gerar uma saída abaixo usando o script bash / ou comando.

Saída desejada:

contacts.USA | Name:John Due | Gender:Male | Age:21 | Address: Texas    
contacts.USA | Name:Ed Mundo | Gender:Male | Age:41 | Address: California    
contacts.BRAZIL | Name:Tom Paul | Gender:Male | Age:26 | Address: Sau Paulo

Exemplo de entrada: Eu tenho 100 arquivos de contatos para diff. países.

Contacts.USA

Name:John Due 
Gender:Male 
Age:21
Address: Texas

Name:Ed Mundo 
Gender:Male 
Age:41 
Address: California

Contacts.Brazil

Name:Tom Paul
Gender:Male 
Age:26 
Address: Sau Paulo

Estou usando o cmd de unix abaixo, mas não consigo gerar a saída desejada.

grep -E 'Name|Gender|Age|Address' contacts.*

a saída deste cmd mostra o resultado em uma linha:

contacts.USA Name:John Due 
contacts.USA Gender:Male 
contacts.USA Age:21 
contacts.USA Address: Texas
contacts.USA Name:Ed Mundo 
contacts.USA Gender:Male     
contacts.USA Age:41    
contacts.USA Address: California    
contacts.BRAZIL Name:Tom Paul     
contacts.BRAZIL Gender:Male    
contacts.BRAZIL Age:26    
contacts.BRAZIL Address: Sau Paulo
    
por trixie101 01.09.2017 / 22:55

2 respostas

5
Solução

awk :

Supondo arquivos de entrada contacts.USA e contacts.BRAZIL .

awk '/Name/{ printf "%s | %s",FILENAME,$0 }
     /Gender|Age|Address/{ printf " | %s",$0; if($0~/Address/) print "" }' contacts.*
  • /Name/{ printf "%s | %s",FILENAME,$0 } - capturando a linha com a palavra-chave Name , anexando o nome do arquivo FILENAME ao início da sequência resultante

  • if($0~/Address/) print "" - imprime o separador de registro (nova linha) depois de encontrar a linha com Address keyword

A saída:

contacts.BRAZIL | Name:Tom Paul | Gender:Male  | Age:26  | Address: Sau Paulo
contacts.USA | Name:John Due  | Gender:Male  | Age:21 | Address: Texas
contacts.USA | Name:Ed Mundo  | Gender:Male  | Age:41  | Address: California
    
por 01.09.2017 / 23:30
2

Algo da versão awk idiomática - usando o "modo de parágrafo":

$ awk '{$1=FILENAME OFS $1} 1' RS= FS='\n' OFS=' | ' Contacts.*
Contacts.Brazil | Name:Tom Paul | Gender:Male  | Age:26  | Address: Sau Paulo
Contacts.USA | Name:John Due  | Gender:Male  | Age:21 | Address: Texas
Contacts.USA | Name:Ed Mundo  | Gender:Male  | Age:41  | Address: California

Uma implementação semelhante em perl:

perl -Mfeature=say -F'\n' -00ne 'say join " | ", $ARGV, @F' Contacts.*
    
por 02.09.2017 / 00:01