Перекрестный вопросhttps://stackoverflow.com/q/57377173/3220113был отложен. Я скопирую принятый ответ здесь, другой вопрос можно удалить.
Для одного файла:Сначала упростите обработку потока с помощью awk (все это можно сделать в awk, для немного лучшей производительности):
sed -nr 's/\|/,/g;s/(^R_MT,.*),S:([^ ]) *$/\1 \2/p' <(zcat abc.log.2019041607.gz)
Результат (после добавления дополнительных тестовых строк)
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 1
R_MT,D:1234,ID:413 0
R_MT,D:1234,ID:413 0
R_MT,D:1234,ID:413 0
R_MT,D:1234,ID:413 0
R_MT,D:1234,ID:413 0
R_MT,D:1234,ID:414 1
R_MT,D:1234,ID:414 1
R_MT,D:1235,ID:413 1
R_MT,D:1235,ID:413 1
А теперь посчитайте их в awk, используя массив a для имен полей.
sed -nr 's/\|/,/g;s/(^R_MT,.*),S:([^ ]) *$/\1 \2/p' <(zcat abc.log.2019041607.gz) |
awk '{a[$1]; if ($2>0) notsub[$1]++; else submit[$1]++;}
END {for (i in a) print i "," submit[i]+0 "," notsub[i]+0;}
'
Для 5 файлов сначала определите, какие результаты вы хотите получить. В каждом файле отдельный выходной файл :использует цикл, подобный
while IFS= read -r filename; do
... <( zcat "${filename}")...
done < <(find datalogs -type f -name "abc*" -mmin -5)
Результаты из 5 файлов добавлены в одну сумму
... <( find datalogs -type f -name "abc*" -mmin -5 -exec zcat {} \;)...