Чтобы получить среднее значение по всем записям, первые записи которых дублируют

В общем случае, невозможно перечислить все функции без выполнения скрипта, потому что функция может быть объявлена чем-то вроде eval $(/some/program). Но если функции объявлены "нормально", вы можете искать вещи, которые выглядят как определения функций.

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript

В сценариях оболочки нет возможности вводить функции или документировать их, поэтому любая документация должна быть представлена в комментариях. Вот грубый фрагмент Perl, который извлекает определения функций в общепринятом формате, а также непосредственно предшествующие или последующие комментарии.

perl -0777 -ne '
    while (/^((?:[ \t]*\#.*\n)*)               # preceding comments
             [ \t]*(?:(\w+)[ \t]*\(\)|         # foo ()
                      function[ \t]+(\w+).*)   # function foo
             ((?:\n[ \t]+\#.*)*)               # following comments
           /mgx) {
        $name = "$2$3";
        $comments = "$1$4";
        $comments =~ s/^[ \t]*#+/#/mg;
        chomp($comments);
        print "$name\n$comments\n";
    }' myscript

Более точный способ вывести имена функций, если вы можете запустить скрипт, не вызывая побочных эффектов, или если вы можете выделить все определения функций в подскрипте, - это запустить скрипт, а затем заставить bash вывести все определения функций. В отличие от вышеописанного метода поиска по тексту, это включает определения функций в странном формате и исключает ложные срабатывания (например, в документах here), но это не может найти комментарии.

bash -c '. myscript; typeset -f'
0
30.01.2019, 17:41
2 ответа

попробуй

 awk '{c[$1]++ ; t[$1]+=$4 }  
    END { for (cc in c ) if ( c[cc]>1 ) printf "%s : %.1f\n",cc,t[cc]/c[cc];}' file.log

которые дают

30903 : 49.5

, чтобы получить вывод, удалите часть if (c[cc]>1).

сценарий в основном подсчитывает c[$1]++и добавляет значение t[$1]+=$4.

  • c[x]для счета (x ), то есть$1:первое поле
  • t[x]для всего (x ), то есть суммы общего значения для 4-го поля

в конце мы перебираем все значения, вычисляя и выводя среднее значение.

3
28.01.2020, 02:23

С Миллером(http://johnkerl.org/miller/doc)можно бегать

mlr --nidx stats1 -a mean -f 4 -g 1 inputFile

и есть

30901 89.000000
30902 51.000000
30903 49.500000
30904 59.000000
  • -f 4для установки значения -имени поля, по которому вычисляется статистика (четвертого поля );
  • -g 1для установки группы -по -именам полей (первое поле ).
0
28.01.2020, 02:23

Теги

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