использование awk с параллельным

использование awk с параллельным

У меня есть около 3000 файлов, каждый из которых имеет размер 300 МБ, и я хотел бы выполнить в них поиск последовательности подстрок как можно быстрее с помощью моего 16-ядерного сервера.

Я попробовал сделать это, но, похоже, это не распараллеливает поиск файлов.

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc

Это склеено из разных how-to, я не совсем понимаю. Есть ли у вас предложения, как мне разделить обработку файлов?

решение1

  1. Посмотрите, есть ли у вас эта parallelпрограмма в системе. (Она может быть из GNU.) Если есть, выясните, как ее использовать. В противном случае,
  2. Запустите ваш findwith output в файл. Используя текстовый редактор или, возможно, скрипт с использованием таких инструментов, как head, разделите этот файл на 16 файлов фрагментов с (примерно) равным количеством строк (т.е. ссылающихся на равное количество найденных файлов). Затем запустите 16 awk … | paste … | bcконвейеров; по одному для каждого файла фрагмента. (И сложите 16 результатов.)

Мне интересно, почему вы используете awkдля подсчета вхождений строки функцию , когда grep -cона специально для этого предназначена.

решение2

GNU parallel довольно совместим с xargs, в вашем случае он может заменить его. Если вы считаете только случаи substringиспользования grep -cкакСкоттпредполагает:

sudo find /mnt2/preprocessed/preprocessed/mo* | 
  sudo parallel grep -c source | paste -sd+ | bc

Обратите внимание, что некоторые версии GNU/Linux устанавливают GNU parallel в совместимом режиме "Tollef's parallel". Вы можете изменить это, добавив --gnuв командную строку аргументы parallel. Чтобы сделать изменение постоянным, добавьте --gnuв ~/.parallel/config.

Связанный контент