Захватить производную промежуточного конвейера, а также запустить остальную часть конвейера - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть куча *.bz2 файлов, содержащих сжатые текстовые данные.Я распаковываю их в один файл intermediary.txt для подсчета вхождений подстроки myString:

find . -name '*bz2' -exec bzip2 -k -c -d {} > intermediary.txt

и затем (для подсчета количества вхождений myString)

echo "Number of occurrences:"
grep -o "myString" intermediary.txt | wc -w

Обработка затем продолжается некоторыми потоковыми манипуляциями:

cat intermediate.txt | sed ... | sed ... | someCommand > out.txt

Теперь я хочу обработать все шаги в одном конвейере, то есть иметь результат в out.txt и все еще иметь число вхождений myString на стандартный вывод без необходимости писать intermediary.txt.Таким образом, конвейер должен выглядеть примерно так:

find . -name '*bz2' -exec bzip2 -k -c -d {} | <some magic here> | sed ... | sed ... | someCommand > out.txt

(Как) Это возможно?

ОБНОВЛЕНИЕ Я опробовал версию @Charles Duffy ниже, но изменилbzip2 - немного разделить для использования bzcat.Я думаю, что это немного менее многословно, и это не должно влиять на производительность (хотя не уверен).

Это выполнит работу.Однако было бы неплохо включить этот конвейер в Pipeline Viewer , чтобы получить некоторую обратную связь о прогрессе (файлов *.bz2 очень много!).Префикс всего этого с pv -cN source < ... не работает.Я разместил отдельный вопрос для этого здесь

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Меньше сложностей, чтобы сохранить то, что вы захватываете как стандартный вывод конца конвейера, и использовать подстановку процесса для других выходных данных:

result=$(find . -name '*bz2' -exec bzip2 -k -c -d {} + \
          | tee >(sed ... | sed ... | someCommand >out.txt) \
          | grep -e myString \
          | wc -l)

Обратите внимание на использование -exec ... {} +, котороезначительно эффективнее, чем операция find, которую вы использовали ранее (при которой для каждого выходного файла выполнялась отдельная копия bzip2).

0 голосов
/ 24 сентября 2018

Вы можете использовать перенаправление и tee:

#! /bin/bash
exec 3>&1
echo $'a\nd\nc\nb' | tee >(wc -w >&3) | sort > output

Вывод echo идет в два потока, один обрабатывается wc и переходит к & 3, что отображается на выходе.Другой обрабатывается sort и сохраняется в файле output.

...