Como posso colocar em ordem alfabética um registro de várias linhas de um arquivo de texto?

1

Oi, estou trabalhando com o script bash e tenho o exemplo.txt abaixo. Como eu posso colocar em ordem alfabética as 4 informações seguintes sobre restaurantes pelo nome do restaurante e imprimi-las? Note que o formato quando impresso em ordem alfabética que deve permanecer o mesmo abaixo, incluindo cidade, estado, endereço, telefone.

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 91341

Restaurant: Five guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 9234211

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 95311

Restaurant: Taco Bell
City: LA
State: CA
Address: 123 Rodeo Drive
Phone: 911
    
por Selena Gomez 27.03.2014 / 06:33

1 resposta

5

Aqui está uma solução usando awk :

$ awk 'BEGIN{FS="\n";RS=""} {r[$1]=$0} END{n = asort(r); for (i=1;i<=n;i++){print r[i] "\n"}}' restaurants 
Restaurant: Five guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 9234211

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 95311

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 91341

Restaurant: Taco Bell
City: LA
State: CA
Address: 123 Rodeo Drive
Phone: 911

awk lê no arquivo um registro por vez. Definimos o separador de registro, RS , como "" , para que os registros sejam separados por uma linha em branco. Todos os registros são lidos em uma matriz r . No final, a matriz r é classificada e impressa.

Como o @Sadi aponta nos comentários, o comando awk é adaptável para usar em um pipeline:

cat restaurants | awk 'BEGIN{FS="\n";RS=""} {r[$1]=$0} END{n = asort(r); for (i=1;i<=n;i++){print r[i] "\n"}}' >sorted_list_of_restaurants
    
por John1024 27.03.2014 / 07:48