Intereting Posts
Emacs Mh выбирает абзац + дополнительную строку что такое упрощение ОС в Linux или Unix? Не удалось загрузить модуль 'nvidia' после обновления до Stretch Метод NGNX HTTP PUT и ошибка 409 Конфликт Проблемы при установке Arch на Chromebook Samsung i686 использование dateformat в logrotate Какие-либо оговорки об использовании bash отредактированы из сценария оболочки в качестве альтернативы экрану? Nginx для реверсирования прокси-сервера на гуакамоле, но RDP не работает во внешней локальной сети с прокси-сервером Сохраняется ли существующий файл при создании символической ссылки с тем же именем? зеркало сайта с wget, что только ответ с gzip Каков правильный способ добавления недостающих дистрибутивов в исполняемый FreeBSD? Последствия наличия переменной переменной $ PATH? Наследование разрешений с помощью ACLS vim: Могу ли я сделать * только * y выполнить копию? Как я могу использовать экран для обучения и / или дистанционной помощи?

Это хорошая идея для фильтрации ввода перед запуском awk-действия?

Если у меня есть ввод, лучше ли фильтровать данные, прежде чем я запустил действие awk или я должен выполнить всю фильтрацию в awk ?

Например, учитывая следующий ввод:

 $ echo "foo\nbar\nbaz" foo bar baz 

Должен ли я запускать:

 $ echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }' foo cats 

Или:

 $ echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }' foo cats 
  • Зачем мне запускать один?
  • Должен ли я использовать другой инструмент?
  • Какие факторы я должен рассматривать?
  • Как я могу проверить эти факторы?

В этом конкретном случае второй вариант является лучшим.

В общем, более эффективно минимизировать количество утилит в конвейере. Лучше не разворачивать ненужные процессы (как в первом примере с ненужным sed процессом). В Интернете нетрудно найти примеры жалоб на бесполезное использование кошки .

В большинстве современных Unix-подобных систем * forking выполняется довольно эффективно, но зависит от размера запускаемого процесса, например, запуск perl или python будет намного медленнее, чем sed или awk .

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

Конкретные вопросы

Зачем мне запускать один?

Если вы более знакомы с синтаксисом одного над другим, может быть лучше для чтения кода (и ремонтопригодности) использовать наиболее знакомый вам инструмент / язык.

Должен ли я использовать другой инструмент?

В этом конкретном случае я бы так не подумал. Оба awk и sed являются подходящими инструментами для такого рода работ.

Какие факторы я должен рассматривать?

Если вам нужно обработать несколько файлов (например, в цикле), то скорость и эффективность будут важны.

Если вы просто обрабатываете один большой файл, каждый раз часто читаемость кода может быть более важной.

Как я могу проверить эти факторы?

Вы можете профилировать разные версии, используя утилиту time , доступную как встроенная оболочка с Bash, но также как отдельная исполняемая программа. Например, запуск двух примерных команд показывает, что первый пример занял .012s длиннее второго.

 $ time echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }' foo\nbar\nbaz cats real 0m0.056s user 0m0.000s sys 0m0.045s $ time echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }' foo\nbar\nbaz cats real 0m0.044s user 0m0.000s sys 0m0.031s 

Обратите внимание, что на тесты профилирования влияют системная нагрузка и другие ограничивающие факторы, поэтому вам нужно будет повторить это много раз, чтобы получить истинное представление о том, какая версия быстрее, чем другая.


* В MS Windows forking более дорогая, поэтому минимизация количества запущенных процессов имеет значение при работе в таких средах, как Cygwin.

Достаточно использовать awk (или sed ) для таких простых случаев. Комбинация нескольких инструментов будет сложной и часто избыточной:

 echo -e "foo\nbar\nbaz" | awk 'NR==1{print $0" cats"}' 

Выход:

 foo cats 

Какие факторы я должен рассматривать?

Убедитесь, что для необходимой обработки текста требуется комбинация нескольких различных инструментов, в противном случае – использование мощности одного отдельного инструмента

Скажем, если мне нужно добавить только определенное слово перед первым словом во входной строке – это также легко с инструментом sed :

 echo -e "foo\nbar\nbaz" | sed 's/^.*$/& cats/; 1q' foo cats 

echo -e , e flag "позволяет интерпретировать обратные слэши"


В любом случае, это зависит от того, насколько сложным является ваш вводный текст и насколько сложны ваши правила обработки текста