How can I alphabetize a multi line record from a text file?

Hi I'm working with bash script and I have example.txt below. How can I alphabetize the following 4 information about restaurants by the restaurant name and print it out? Note that the format when printed alphabetically that it should remain the same as below including city, state, address, phone.

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

1 Answer

Here is a solution using 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 reads in the file one record at a time. We define the record separator, RS, to be "" so that records are separated by a blank line. All the records are read into an array r. At the end, the array r is sorted and printed.

As @Sadi points out in the comments, the awk command is adaptable to use in a 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
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like