О awk shell и pipe в linux - PullRequest
       3

О awk shell и pipe в linux

3 голосов
/ 12 декабря 2011

каждый, я имею дело с файлом журнала, который имеет около 5 миллионов строк, поэтому я использую оболочку awk в linux

Я должен grep доменов и получить самые высокие 100 в журнале, поэтому янапишите так:

          awk '{print $19}' $1 | 
          awk '{ split($0, string, "/");print string[1]}' |
          awk '{domains[$0]++} END{for(j in domains) print domains[j], j}' |
          sort -n | tail -n 100 > $2

он работает около 13 секунд

затем я изменяю скрипт следующим образом:

          awk 'split($19, string, "/"); domains[string[1]]++}
               END{for(j in domains) print domains[j], j}' $1 |
          sort -n | tail -n 100 > $2

он работает около 21 секунды

почему?

вы знаете, что одна строка оболочки awk может уменьшить сумму cal, она только читает каждую строку один раз, но время увеличивается ...

так что, если вы знаетеответь, скажи мне

1 Ответ

3 голосов
/ 12 декабря 2011

Когда вы передаете команды по конвейеру, они выполняются параллельно, пока канал заполнен.

Поэтому я предполагаю, что в первой версии работа распределяется между вашими процессорами, а во второй - вся работасделано одним ядром.

Вы можете проверить это с помощью top (или, лучше, htop).


Из любопытства, это быстрее?(не проверено):

cut -f 19 -d' ' $1 | cut -f1 -d'/' | sort | uniq -c | sort -nr | head -n 100 > $2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...