Сортировать по числам

Как и в случае с любой другой командой, используйте - , чтобы указать команде, что последующие аргументы, начинающиеся с - , являются не варианты.

alias -='cd -'

Вы можете предпочесть сделать - функцией, чтобы использовать ее, когда у нее есть аргументы. В zsh - - это модификатор предварительной команды , который запускает команду с - , добавленными к нулевому аргументу. (Конечно, это немного неясно, и вы можете использовать переменную ARGV0 для достижения того же эффекта.) В отличие от псевдонима , функция не является встроенной команда, но ключевое слово, которое не принимает параметры, поэтому вы можете использовать функцию - .

function - {
  if [[ $# -eq 0 ]]; then
    cd "$OLDPWD"
  else
    builtin - "$@"
  fi
}

(Или как хотите - foo сделать.)

0
13.06.2018, 21:15
2 ответа

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

.
4
28.01.2020, 02:13

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

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

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

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

5
28.01.2020, 02:13

Теги

Похожие вопросы