Сортировка по номерам

Мне нужно отсортировать список по file.sh ISBN (третий столбец) из входного файла в file.sh и отправить в file.sh файл ( file.out ). Входной файл ( file.input ) будет иметь список

 Donald Smith,Fire Lands,97868545414459 Adam Barry,The Armies,97564325678855 Jennifer Lelan,Childhood dreams,97546766544237 

Использование циклической структуры для обработки данных и заголовков. Author Name of book ISBN .

Результат

 Author Name of Book ISBN Jennifer Lelan Chilhood Dreams 97546766544237 Adam Barry The Armies 97564325678855 Donald Smith Fire Lands 97868545414459 

    Прежде всего, вы не будете зацикливаться на этих данных: почему использование цикла оболочки для обработки текста считается плохой практикой?

    Если единственными запятыми в файле являются запятые, разделяющие поля, то

     sort -t ',' -k3n -o file.output file.input 

    отсортирует данные по числу в третьем столбце. Вывод будет записан в file.output .

    Для заданных данных file.output будет выглядеть так:

     Jennifer Lelan,Childhood dreams,97546766544237 Adam Barry,The Armies,97564325678855 Donald Smith,Fire Lands,97868545414459 

    Для дальнейшей обработки этих данных можно использовать программу awk . Поскольку вы не указали, какую обработку вы хотели бы выполнить, следующее просто извлекает данные в переменные (не обязательно) для каждой строки и печатает их:

     sort -t ',' -k3n file.input | awk -F ',' '{ author=$1; title=$2; isbn=$3; printf("Author: %s\nTitle: %s\nISBN: %s\n", author, title, isbn) }' 

    Обратите внимание, что в этом случае нет необходимости хранить отсортированные данные в промежуточном файле.

    На выходе приведены данные в вопросе:

     Author: Jennifer Lelan Title: Childhood dreams ISBN: 97546766544237 Author: Adam Barry Title: The Armies ISBN: 97564325678855 Author: Donald Smith Title: Fire Lands ISBN: 97868545414459 

    Для получения данных в хорошо выглядящих столбцах и с тире в номере ISBN вам не нужен awk . Следующее использует sed для форматирования номеров ISBN и column для форматирования столбцов:

     sort -t ',' -k3n file.input | sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/' | column -s ',' -t 

    Выход будет

     Jennifer Lelan Childhood dreams 975-4676-65442-37 Adam Barry The Armies 975-6432-56788-55 Donald Smith Fire Lands 978-6854-54144-59 

    Обратите внимание, что номера ISBN выглядят немного странно. Это потому, что они длиной 14 цифр. Настоящие номера ISBN имеют длину 10 или 13 цифр , и в приведенном выше коде предполагается, что они состоят из 13 цифр (или не менее 12 цифр).

    Чтобы добавить заголовки столбцов:

     sort -t ',' -k3n file.input | { echo 'Author,Name of book,ISBN' sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/' } | column -s ',' -t 

    Который производит

     Author Name of book ISBN Jennifer Lelan Childhood dreams 975-4676-65442-37 Adam Barry The Armies 975-6432-56788-55 Donald Smith Fire Lands 978-6854-54144-59 

    … не используя явных циклов в оболочке.

    sort явно лучший инструмент для сортировки.

    Если требуется awk , вы можете использовать GNU awk:

     gawk -F, ' {line[$NF] = $0} END { PROCINFO["sorted_in"] = "@ind_num_asc" for (isbn in line) print line[isbn] } ' file 

    См. https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html и https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html.