Хорошая ли идея - фильтровать ввод перед выполнением действия awk?

Ознакомьтесь с общим выпуском для систем Debian. И SID (нестабильный) , в частности:

Короче говоря: большая часть вашего программного обеспечения не будет работать (вам ДЕЙСТВИТЕЛЬНО нужна самая последняя версия программного обеспечения? Особенно, если оно содержит ошибки? Если да, вы можете установить его вручную + вы можете добавить репозитории предыдущих, более стабильных выпусков в свой /etc/apt/sources.list , скомпилировать программное обеспечение самостоятельно и т. д.), и вы не получите своевременных обновлений безопасности. Вполне может пройти ОЧЕНЬ долгое время, прежде чем SID станет стабильным, потому что команда Debian «не устанавливает никаких сроков» (что с их энтузиазмом, «открытым исходным кодом» и прочим джазом). Они «готовы, когда они готовы».

Я пользователь Debian Jessie.

Всего наилучшего! Продолжайте взламывать!

2
11.04.2017, 22:53
2 ответа

В данном конкретном случае лучше использовать второй вариант.

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

В большинстве современных Unix-подобных систем* разветвление осуществляется достаточно эффективно, но это зависит от размера запускаемого процесса, например, запуск 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 разветвление обходится дороже, поэтому минимизация количества запускаемых процессов имеет значение при работе в таких средах, как Cygwin.

1
27.01.2020, 22:10

Для таких простых случаев достаточно использовать инструмент 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 флаг «включает интерпретацию экранирования обратной косой черты»


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

1
27.01.2020, 22:10

Теги

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