Про какое второе значение речь? Вторую позицию в строке или второй октет в mac? Могут ли в файле быть пробелы до mac-адреса? Второе число в какой системе счисления? Могут ли быть другие значения кроме MAC и числа?
awk тут избыточен, более чем достаточно простого grep
Но ведь в ПП есть задача сравнить несколько чисел, и в случае с awk числа удаётся сравнить арифметически, а в случае с grep - как строки, через регулярные выражения.
Ага, а как только появляется доп. требование для обработки, это превращается в такую write-only лапшу
А кто мешает пользоваться наиболее подходящим инструментом, когда это разумно? Например, задача точно как сформулирована — берём grep. Задача усложняется — переходим на awk.
А потом выясняется, что это подзадача из большого скрипта, который и так уже тормозит, а вы хотите ещё звать внешние проги, хотя на том же bash это всё можно сделать не так и сложно и тормозно, ибо строчек в конфиге может быть и не много.
В ПП есть требование сравнить второе число с 25 и записать в файл сравниваемое число при выполнении сравнения
Как - не имеет значения; однако
Решение средствами шелла - на каждый чих создавать процесс: парсинг, запись в файл (тут не совсем создание процесса, но дёргание fopen - есть в каждой итерации при выполнении условия). Это не плохо, так работает шелл - он запилен под работу с процессами.
POSIX sh или bash - вообще плевать.
Средствами grep достаются значения, но сравниваются они как строки. Тем не менее, процесс создаётся только один раз и fopen - тоже один.
Средствами awk достаются значения и сравниваются арифметически. exec/fopen - всё ещё только один вызов.
Вот и получается, что нужно использовать именно awk.
Ну зачем вы продолжаете показываеть своё незнание шелла? fopen можно делать ровно раз:: exec 3>file перед циклом, а к echo дописать 1>&3 Никакого дополнительного процесса в указанном скрипте нет. И shell не работает с stdio, потому и не fopen, а open
Для вашей копилки знаний sh: cmp у вас либо 0 либо 1, потому «» не обязательны, а только тормозят; операция '=' - строковая, она медленнее, чем численная -gt, да и сравнивать разнеся на две строки — запутывать читателя. Итого внутренность цикла будет:
value=$((0x$second))
[ $value -gt 25 ] && ...
А вообще, судя по тому, какое ТС выбрал решение, задача была другая, сравнивать второе поле после пробела :)
Это оптимальное решение, если ВСЯ ваша программа написана на awk. Если это не так, то awk тот ещё монстр, и однострочники на нём хорошо работают для человека, с его реакцией, но не в сложном скрипте на другом языке.
Все реализации sh, про которые мне известно, на каждую строку вообще malloc делают, а он, значит, кавычки оптимизирует — тормозят они у него, видите ли.
Итого внутренность цикла будет:
А чё не
[ $((0x$second>25)) ]&&…
? Ну там, без пробельчиков, чтоб не тормозило, лол:
$ ( echo second=af; repeat 200000 echo '[ $((0x$second>25)) = 1 ]&&echo 1' ) > foo.sh; time sh foo.sh >/dev/null
real 2.09s
user 2.03s
sys 0.06s
$ ( echo second=af; repeat 200000 echo 'v=$((0x$second));[ $v -gt 25 ]&&echo 1' ) > foo.sh; time sh foo.sh >/dev/null
real 2.89s
user 2.80s
sys 0.08s
Все реализации sh, про которые мне известно, на каждую строку вообще malloc делают
Все мне известные sh работают со собственной реализацией malloc, даже название тянется уже 40 лет как stalloc, отличие которого в быстром расширении при формировании строки и моментальном освобождении при завершении области видимости/освобождении нод парсера.
А чё не
Как вы предсказуемы :) Так читается хуже в другую сторону.
Накой вообще у вас это желание сравнивать с единицей, если по условию надо тоже сравнивать, но с другим числом? Да если б не перевод hex-dec, арифметика вообще бы не нужна была.