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