Мне нужно отсортировать список по 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.