awk bash рекурсивные скобки id sed tr - PullRequest
0 голосов
/ 19 сентября 2018

Сервер предоставляет список идентификаторов активов, разделенных запятыми в квадратных скобках после даты и двоеточий:

20160420084726:-
20160420085418:[111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085522:[111344871, 111394583, 111295547, 111379566, 111352520]
20160420090022:[111344871, 111394583, 111295547, 111379566, 111352520]

Формат журнала ввода:

timestamp:ads

Где: timestamp имеет формат YYYYMMDDhhmmss, а ads - это список идентификаторов рекламных активов, разделенных запятыми, заключенный в квадратные скобки, или -, если реклама не была возвращена.

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

  • Количество возвращенных идентификаторов
  • Количество возвращенных уникальных идентификаторов
  • Скрипт должен поддерживать параметр командной строки, чтобы выбрать, следует ли указывать уникальные или общие идентификаторы.

Пример вывода с использованием приведенной выше выдержки из журнала (в режиме итога):

20160420084:0
20160420085:26
20160420090:5

И в режиме уникального подсчета это даст:

20160420084:0
20160420085:19
20160420090:5

Я пробовал это:

awk -F '[,:]' '
                    {
                      key = substr($1,1,11)"0"
                      count[key] += ($2 == "-" ? 0 : NF-1)
                    } 
                    END {
                    PROCINFO["sorted_in"] = "@ind_num_asc"
                    for (key in count) print key, count[key]
                  }
                    ' $LOGFILENAME | grep $DATE;

С сценариями, приведенными до сих пор, другие сценарии терпят неудачу.Например, этот:

файл журнала: https://drive.google.com/file/d/1sXFvLyCH8gZrXiqf095MubyP7-sLVUXt/view?usp=sharing

Первые несколько строк результатов должны быть:

неуникально:

20160420000:1
20160420001:11
20160420002:13
20160420003:16
20160420004:3
20160420005:3
20160420010:6

уникальный:

20160420000:1
20160420001:5
20160420002:5
20160420003:5
20160420004:3
20160420005:3
20160420010:4

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018
$ cat tst.awk
BEGIN { FS="[]:[]+"; OFS=":" }
{
    tot = unq = 0
    time = substr($1,1,11)
    if ( /,/ ) {
        tot = split($2,tmp,/, ?/)
        for ( i in tmp ) {
            if ( !seen[time,tmp[i]]++ ) {
                unq++
            }
        }
    }
    tots[time] += tot
    unqs[time] += unq
}
END {
    for (time in tots) {
        print time, tots[time], unqs[time]
    }
}

$ awk -f tst.awk file
20160420084:0:0
20160420085:26:19
20160420090:5:5

Массаж для костюма ...

0 голосов
/ 20 сентября 2018
#!/bin/bash
while read; do
   dts=$( echo "$REPLY" | cut -d: -f1 )
   ids=$( echo "$REPLY" | grep -o '\[.*\]' )
   if [ $? -eq 0 ]; then
       ids=$( echo "$ids" | tr -d '[] ' | tr ',' '\n' | sort $1 )
       count=$( echo "$ids" | wc -l )
   else
       count=0
   fi
   echo $dts: $count
done

Беги так:

./script.sh [-u] <input.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...