Сначала преобразуйте файл recon.txt в формат, который можно быстро использовать для grep -F:
perl -pe 's/,/| version=/' recon.txt > recon.grep-F
Тогда ваша ситуация будет описана на https://www.gnu.org/software/parallel/man. html # ПРИМЕР: -Grepping-n-lines-for-m-regular-expressions
Здесь текст адаптирован для вашей задачи:
Простейшее решение grep большого файла для большого количества регулярных выражений:
grep -f regexps.txt bigfile
Или, если регулярные выражения представляют собой фиксированные строки:
grep -F -f recon.grep-F worker.log
Есть 2 ограничивающих фактора: ЦП и дисковый ввод-вывод. ЦП легко измерить: если grep занимает> 90% ЦП (например, при работе на вершине), то ЦП является ограничивающим фактором, и распараллеливание ускорит это. Если нет, то дисковый ввод-вывод является ограничивающим фактором, и в зависимости от дисковой системы распараллеливание может быть быстрее или медленнее. Единственный способ узнать наверняка - это измерить.
Если центральный процессор является ограничивающим фактором, необходимо выполнить распараллеливание регулярных выражений:
cat recon.grep-F | parallel --pipe -L1000 --round-robin grep -F -f - worker.log
Если строка соответствует нескольким регулярным выражениям, строка может быть продублирована. Команда запускает один grep для каждого ЦП и читает большой файл один раз для ЦП, но поскольку это выполняется параллельно, все чтения, кроме первого, будут кэшироваться в ОЗУ. В зависимости от размера regexp.txt может быть быстрее использовать --block 10m вместо -L1000. Если regexp.txt слишком велик для размещения в ОЗУ, удалите --round-robin и настройте -L1000. Это приведет к тому, что bigfile будет прочитан больше раз.
Некоторые системы хранения работают лучше при параллельном чтении нескольких фрагментов. Это верно для некоторых систем RAID и некоторых сетевых файловых систем. Чтобы распараллелить чтение большого файла:
parallel --pipepart --block 100M -a worker.log -k grep -F -f recon.grep-F
Это разделит большой файл на блоки по 100 МБ и запустит команду grep для каждого из этих блоков. Чтобы распараллелить чтение bigfile и regexp.txt объединить их с помощью --fifo:
parallel --pipepart --block 100M -a worker.log --fifo cat recon.grep-F \
\| parallel --pipe -L1000 --round-robin grep -f - {}
Если строка соответствует нескольким регулярным выражениям, строка может быть продублирована.
Вместо того, чтобы использовать lp
напрямую, вы можете попробовать использовать imageMagick, чтобы сделать одно изображение из двух или более изображений, а затем распечатать их
convert image1.png image2.png image3.pgn -append output.png
поместит изображения одно над другим. Если вы замените -append
на +append
, изображения будут располагаться стороной -на стороне -.
lp
не знает о файлах изображений; он может перенести это на драйверы для конкретных устройств , используя опции, которые реализуют функции, которые "вероятно" будут поддерживаться множеством устройств. На странице руководства lp
нет списка подходящих вариантов для ваших целей.
Вместо этого, если вы хотите, чтобы на одном листе бумаги отображалось несколько файлов изображений, вы можете сделать это, комбинируя изображения в одностраничные изображения в нужном вам порядке. Для этого пригодятся такие программы, как ImageMagick.
Дополнительная литература:
Альтернативным методом принятого ответа является использование команды ImageMagick montage
, которая обеспечивает дополнительную гибкость при определении размера сетки (плитки ):
montage -tile 1x2 -mode concatenate *.png page.png
Команда создаст несколько страниц -*коллажей.png для каждого набора входных файлов, которые помещаются на одной странице.