Как и в случае с любой другой командой, используйте -
, чтобы указать команде, что последующие аргументы, начинающиеся с -
, являются не варианты.
alias -='cd -'
Вы можете предпочесть сделать -
функцией, чтобы использовать ее, когда у нее есть аргументы. В zsh -
- это модификатор предварительной команды , который запускает команду с -
, добавленными к нулевому аргументу. (Конечно, это немного неясно, и вы можете использовать переменную ARGV0
для достижения того же эффекта.) В отличие от псевдонима
, функция
не является встроенной команда, но ключевое слово, которое не принимает параметры, поэтому вы можете использовать функцию -
.
function - {
if [[ $# -eq 0 ]]; then
cd "$OLDPWD"
else
builtin - "$@"
fi
}
(Или как хотите - foo
сделать.)
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
.Во-первых, вы не перебираете эти данные в цикле:Почему использование цикла оболочки для обработки текста считается плохой практикой?
Если в файле используются только запятые, разделяющие поля, то
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
... без использования явных циклов в оболочке.