Использование grep и поиск уникальных вхождений с помощью команды awk

Если sedвас устраивает:

sed '/CLUSQMGR(/!d;s///;N;s/).*\n[^(]*(/ /;s/)$//'

Пояснение:

  • Основная идея :обе строки идут как пара, поэтому, если первая из пары найдена, читаем следующую и делаем некоторую замену, чтобы удалить все ненужное
  • /CLUSQMGR(/!dигнорирует все строки, не содержащие CLUSQMGR(, на тот случай, если могут быть другие строки, которые вам не нужны
  • s///удаляет последний паттерн, которым являетсяCLUSQMGR(
  • Nдобавляет следующую строку в пространство шаблонов со встроенным символом новой строки
  • s/).*\n[^(]*(/ /заменяет все от закрывающей скобки до первой открывающей скобки второй строки пробелом. Это делается путем привязки шаблона к символам новой строки(\n[^(]*, соответствующим любому количеству символов, кроме (
  • .
  • s/)$//удаляет завершающий)
0
22.04.2020, 13:56
1 ответ

Для несжатых и сжатых файлов попробуйте:

for f in FILENAME_*; do
    zcat -f "$f" | awk '/2020-04-20\|12345\|/ {rec=$2 "|" $3 "|" $4; a[rec]+=1}  
         END {for (rec in a) print FILENAME " : " rec " : " a[rec]}'
done  > output.txt

Краткое пояснение:

  • первый цикл по всем вашим возможным именам файлов с подстановкой(*).
  • Используйте zcat -f <filename>для распаковки входного файла (см. 1 , 2 ... )при необходимости на лету(-fопция ).
  • zcat -f <filename> | awk...использует распакованный вывод файла $fв качестве входных данных для awk.
  • для каждого найденного шаблона 2020-04-20|12345|увеличивайте массив ассоциативных счетчиков aкаждый раз, когда встречаете значение $2 | $3 | $4в записи, проанализированной awk.
  • когда вы закончите синтаксический анализ файла(ENDблока )и для каждого компонента recассоциативного массива a, конкатенация -напечатайте имя файла 'FILENAME', recзначение $2 | $3 | $4и количество вхождений этого значения a[rec].
  • awkделает доступными некоторые удобные внутренние переменные, такие как текущее обрабатываемое имя файла FILENAME.
  • Однократное перенаправление последовательных выходов цикла forна output.txtсовершенно необязательно. Если вы подавите это, вы просто выведите на stdout.

===================================

Этот ответ был ИЗМЕНЕН и улучшен на основе множества полезных комментариев @AdminBee, @roaima, @dave _thompson и @kusalananda.

1
19.03.2021, 02:26

Теги

Похожие вопросы