Короче говоря: в 1986 году интервьюер попросил Дональда Кнута написать программу, в которой вводится текст и число N на входе, и перечислены N наиболее используемых слов, отсортированных по их частотам. Кнут произвел 10-страничную программу Паскаля, на что ответил Дуглас Макилрой со следующей 6-строчной оболочкой script:
tr -cs A-Za-z '\n' |
tr A-Z a-z |
sort |
uniq -c |
sort -rn |
sed ${1}q
Прочитайте полную версию http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/.
Конечно, у них были разные цели: Кнут показывал свои концепции грамотного программирования и строил все с нуля, в то время как Макилрой использовал несколько общих утилит UNIX для достижения кратчайшего исходного кода.
Мой вопрос: насколько это плохо?
(Чисто с точки зрения времени выполнения, так как я уверен, что мы все согласны с тем, что 6 строк кода легче понять/поддерживать, чем 10 страниц, грамотное программирование или нет.)
Я понимаю, что sort -rn | sed ${1}q
может быть не самым эффективным способом извлечения общих слов, но что не так с tr -sc A-za-z '\n' | tr A-Z a-z
? Это выглядит очень хорошо для меня.
О sort | uniq -c
заключается в том, что очень медленный способ определения частот?
Несколько соображений:
-
tr
должно быть линейное время (?) -
sort
Я не уверен, но я предполагаю, что это не так плохо. -
uniq
также должно быть линейным. - Процессы нереста должны быть линейными (в количестве процессов)