Уникальный счетчик значения в заархивированном файле на основе других ограничений на окружающие строки - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть файл журнала.

Имеет такие данные:

Operation=ABC,
CustomerId=12,
..
..
..
Counters=qwe=1,wer=2,mbn=4,Hello=0, 
----
Operation=CQW,
CustomerId=10,
Time=blah,
..
..
Counters=qwe=1,wer=2,mbn=4,Hello=0,jvnf=2,njfs=4
----
Operation=ABC,
CustomerId=12,
Metric=blah
..
..
Counters=qwe=1,wer=2,mbn=4,Hello=1, uisg=2,vieus=3
----
Operation=ABC,
CustomerId=12,
Metric=blah
..
..
Counters=qwe=1,wer=2,mbn=4,Hello:0, uisg=2,vieus=3
----

Теперь я хочу найти все уникальные CustomerIds, где Operation = ABC и Hello = 0 (в счетчиках).

Вся эта информация содержится в файлах .gz в каталоге.

Итак, вот что я пытался просто узнать, сколько раз в строках рядом с ним появляются Operation = ABC и "Hello = 0".

zgrep -A 20 "Operation=ABC" * | grep "Hello=0" | wc -l

Это дало мнесколько раз было найдено «Hello = 0» для Operation = ABC.(около 250)

Чтобы получить уникальные идентификаторы клиентов, я попробовал это:

zgrep -A 20 "Operation=ABC" * | grep "Hello=0" -B 10 | grep "CustomerId" | uniq -c 

Это не дало мне никаких результатов.Что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вам НЕ нужно использовать эти многие grep и zgrep, мы могли бы сделать это в течение одного awk.

awk -F'=' '
/^--/{
  if(val==3){
    print value
  }
  val=value=""
}
/Operation=ABC/{
  val++
}
/CustomerId/{
  if(!a[$NF]++){
     val++
  }
}
/Hello=0/{
  val++
}
{
  value=(value?value ORS:"")$0
}
END{
  if(val && value){
     print value
  }
}'  <(gzip -dc input_file.gz)

Вывод будет следующим (проверено только на вашем образце):

Operation=ABC,
CustomerId=12,
..
..
..
Counters=qwe=1,wer=2,mbn=4,Hello=0,
0 голосов
/ 14 декабря 2018

На самом деле, это работает.Я просто был нетерпеливым.

zgrep -A 20 "Operation=ABC" * | grep "Hello=0" -B 10 | grep "CustomerId" | uniq -c 
...