Ответы, которые Вы нашли на Exchange Стека, являются правильными, и это учебное руководство является неправильным. Можно экспериментировать собой или искать его в стандарте. Сброс IFS
эквивалентно установке его к значению по умолчанию новой строки вкладки пространства, в то время как пустое IFS
эффективно выключает полевое разделение.
Можно консультироваться со страницей Sven Mascheck по поводу IFS об исторических реализациях. Нескольким историческим оболочкам не нравилось unset IFS
, и очень старая версия ksh рассматривала его как пустое IFS
но все современные оболочки и самые старые оболочки рассматривают сброс IFS
как значение по умолчанию.
Вы не должны запускать свой сценарий с IFS=
если Вы не хотите выключить полевое разделение (который может быть разумным решением — но отметить, что все еще необходимо поместить двойные кавычки вокруг замен для предотвращения globbing, если Вы не выключаете это с set -f
также). Для сброса значения по умолчанию использовать unset IFS
. Это спорно, полезно ли это в начале сценария; существует много других плохих вещей такой как изворотливое PATH
то, что вызывающая сторона может сделать, чтобы заставить Ваш сценарий пойти не так, как надо.
Это учебное руководство также советует для сброса PATH
. Это - обычно плохой совет. В большинстве случаев Вы не можете предсказать, каков корректный путь поиска, но пользователь знает. Как Вы знаете ли /usr/local/bin
или /home/bob/bin
содержит исправленные версии ошибки утилит на древнем Unix где те в /usr/bin
багги? Вы действительно хотите встроить всю логику, чтобы выяснить, поместить ли /usr/xpg6/bin
перед /bin
? В том, какое положение Вы хотите /usr/gnu/bin
? Не сбрасывайте ПУТЬ, если Ваш сценарий не предназначается для определенной системы.
Я не прочитал это учебное руководство, но я действительно проверял одну вещь: это не говорит Вам с самого начала всегда помещать двойные кавычки вокруг замен команды и подстановок переменных. Таким образом, я не думаю, что это учебное руководство является хорошим.
Это должно работать, если я правильно понял, вам нужны только строки, начинающиеся с ATOM
.
sort -k11 <(awk '$1 ~ /ATOM/' file)
Объяснение:
sort -k11
: сортировать по 11-му полю awk '$ 1 ~ / ATOM /' file
: печатает только поля, начинающиеся с ATOM
Часть awk
является входом в часть sort
Каким должен быть конечный результат? Должны ли все строки с первым полем ATOM отображаться вверху файла, в конце файла?
Если можно, чтобы ATOM где-нибудь в списке, то можно отсортировать их в другом файле и добавить в начало или конец исходного файла или в определенный столбец. Я уверен, что кто-то другой опубликует более простое решение - пока только мои два цента ..
grep -v ^ATOM file > result; sort -k11 < grep ^ATOM file >> result