awk
Недавно понадобилось сделать простую операцию над текстовым файлом: посчитать минимальную/максимальную длину строки. Звучит элементарно, ща быстренько состряпаем что-нибудь из cat
+ wc
+ sort
… Только надо подобрать правильную комбинацию параметров и xargs
вставить. С наскока, разумеется, не получилось. На питоне ради этого писать лениво, и в итоге на StackOverflow было найдено решение с awk
:
awk '{print length}' input.txt | sort -rn | head
На чистом awk
минимум будет выглядеть так (решение предложено ChatGPT):
awk 'NR == 1 || length < min { min = length } END { print min }' input.txt
Еще проще будет посчитать среднюю длину строки:
awk '{total += length} END {print total/NR}' input.txt
Раньше я обычно игнорировал решения на awk
, потому что они были не очень понятны в отличие от различных комбинаций grep
, sed
, cut
, wc
, sort
и прочих: они достаточно простые, и “делают одну вещь хорошо”. А если что-то серьезное возникало — то писал что-то на питоне.
Но после описанного случая решил немного почитать про awk
и, оказывается, он из коробки поддерживает построчную обработку (питонячий бойлерплейт), разбивку на поля (cut
) и регулярки (grep
/sed
). Достигается это за счет довольно интересной концепции: каждая строка проверяется по паттерну(ам) — условию/регулярке, и если она соответствует, то выполняется действие в фигурных скобках. В общем, планирую попробовать.
Хотя можно не париться и просто ChatGPT попросить скрипт написать.