Подсчет строк обработанных данных при их анализе - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь найти способ подсчитать количество строк, которые были обработаны при анализе входящих данных из миллионов маленьких файлов.

Пример данных, например, tab - это разделитель:

CLIENT1.test.com    /var    DIR 21213412    user1   root    default 2000-03-04 18:30:59.000000 PROC_MGMT
CLIENT1.test.com    /usr    DIR 212112  user1   root    default 2006-02-11 08:30:00.000000 PROC_MGMT
CLIENT2.test.com    /var/tmp/test.txt   ACTIVE  FILE    4000    sysuser sysuser NA  2001-04-11 03:00:09.000000 DEFAULT
CLIENT3.test.com    /test.out   PASSIVE FILE    4000    atuser  atgroup group   2012-05-04 02:30:59.000000 AUTOMAT
CLIENT4.test.com    /opt    DIR 542016  dbuser  dbgroup Default 2000-03-04 18:30:59.000000 SYSTEM

Мой код в настоящее время выглядит примерно так:

PATTERN="mssg1|mssg2|mssg3|...|mssgN"
SERVER=my_server_name

find <path> -type f -name "*.txt" -print0 | \
xargs -0 awk -v PAT="$PATTERN" '$0!~PAT' | \
awk '{gsub(/\t/",") {print}}' | \
awk -v SRV="$SERVER" 'BEGIN {FS=OFS=","} {$1=SRV OFS $1;} {if ($4 !~ /DIR/) $4=","$4;} {print}' | \
awk 'BEGIN {FS=OFS=","} {if ($9 == "") $9="01/01/1970 00:00:00 AM"; else {gsub("[:-]"," ",$9); $9=strftime("%m/%d%/Y %r", maketime($9))};} {print}' > /tmp/outputFile.log

Я могу сосчитать общее числострок всех входящих файлов, запустив цикл for и wc -l (что, я думаю, будет довольно медленно) и поместив его как yyyy количество строк.То, что я ищу, это подсчитать количество строк, которые я уже обработал.Чтобы я мог показать что-то вроде

echo "Processed xxxx lines out of yyyy lines"

, где xxxx делится на 1000. Например:

Processed 1000 lines out of 1000000 lines.
Processed 2000 lines out of 1000000 lines.
Processed 3000 lines out of 1000000 lines.
.........
Processed 1000000 lines out of 1000000 lines.
Done.

Могу ли я добавить счетчик к операторам awk, которые яиспользуя?

Мой код bash основан на RHEL 6.7.

1 Ответ

0 голосов
/ 15 октября 2018

Следующая программа объединяет весь ваш конвейер.

Можно указать количество ваших записей, но невозможно вывести общее количество строк, если вы не знаете,сколько строк заранее.Вы знаете, сколько файлов существует, так что вы можете использовать их в качестве счетчика.

PATTERN="mssg1|mssg2|mssg3|...|mssgN"
SERVER=my_server_name
find <path> -type f -name "*.txt" -print0 | \
xargs -0 awk -v PAT="$PATTERN" -v SRV="$SERVER" -v OUT=/tmp/outputFile.log '
      BEGIN {FS=OFS=","}
      (FNR==1){f++} 
      # print progress
      (NR%1000==0){ print "Processed "NR" lines and "f-1" files out of "ARGC-2 }
      # skip line matching pattern
      ($0~PAT){next}
      # substitute all tabs, prepend SRV and redefine fields
      # after this point, we inserted a new field before everything
      { gsub(/\t/,","); $0=SRV OFS $0 }
      # redefine $6 which automatically redefines fields
      # after this line, $4 will be an empty field and $5 will be the old $4
      ($4 !~ /DIR/){ $4 = OFS $4 }
      # process field 9
      { if ($9 == "") $9="01/01/1970 00:00:00 AM"
        else { gsub("[-:]"," ",$9); $9=strftime("%m/%d%/Y %r", maketime($9))} }
      # print to output file
      { print $0 > OUT }
      END{ print "Total lines processed: "NR
           print "Total files processed: "f  }'

Общая рекомендация относительно дат: избегайте всего, что не сортируется, ваш формат "mm / dd / yyyy",при сортировке ascii не сортируется по дате, а "гггг-мм-дд".Кроме того, AM и PM для времени не имеют большого смысла.

https://xkcd.com/1179/

Если вы хотите вывести статус в файле состояния, вы делаете

xargs ... | awk ' ... 
    END{ print "Total lines processed: "NR > "status.txt"
         print "Total files processed: "f  > "status.txt" }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...