Как получить всю статистическую информацию из файла, используя awk? - PullRequest
2 голосов
/ 22 августа 2011

Я пытаюсь проанализировать некоторые файлы CSV, используя awk.

Файл CSV, с которым я работаю, выглядит следующим образом:

fnName,minAccessTime,maxAccessTime
getInfo,300,600
getStage,600,800
getStage,600,800
getInfo,250,620
getInfo,200,700
getStage,700,1000
getInfo,280,600

Мне нужно найти минимум, максимуми средние значения для столбцов 2 и 3 как по всем данным, так и по отдельным функциям.

Ответы [ 3 ]

6 голосов
/ 22 августа 2011

Я понимаю, что вы не ищете не-awk-решения, но я решил поделиться кодом R, чтобы продемонстрировать, как легко суммировать данные.

# read in data
awk <- read.table(textConnection("fnName,minAccessTime,maxAccessTime
getInfo,300,600
getStage,600,800
getStage,600,800
getInfo,250,620
getInfo,200,700
getStage,700,1000
getInfo,280,600"), header = TRUE, sep = ",")

# split according to the function
awk.split <- split(awk, awk$fnName)

# for each function, calculate full summary for columns 2 and 3
lapply(X = awk.split, FUN = function(x) {
            summary(x[2:3])
        })

Результат:

$getInfo
 minAccessTime   maxAccessTime
 Min.   :200.0   Min.   :600  
 1st Qu.:237.5   1st Qu.:600  
 Median :265.0   Median :610  
 Mean   :257.5   Mean   :630  
 3rd Qu.:285.0   3rd Qu.:640  
 Max.   :300.0   Max.   :700  

$getStage
 minAccessTime   maxAccessTime   
 Min.   :600.0   Min.   : 800.0  
 1st Qu.:600.0   1st Qu.: 800.0  
 Median :600.0   Median : 800.0  
 Mean   :633.3   Mean   : 866.7  
 3rd Qu.:650.0   3rd Qu.: 900.0  
 Max.   :700.0   Max.   :1000.0 
4 голосов
/ 22 августа 2011

Этот скрипт awk должен дать вам все необходимые навыки, чтобы получить то, что вы хотите.

Он в основном проходит по всем строкам во входном файле, игнорируя те, где второе поле - minAccessTime (Заголовок CSV).

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

Первый хранится в count, min_min, max_min, min_max, max_max, sum_min и sum_max.Последние хранятся в ассоциативных массивах с похожими именами (с добавлением _arr).

Затем, как только все записи прочитаны, секция END выводит информацию.

NR > 1 {
    count++;
    sum_min += $2;
    sum_max += $3;
    if (count == 1) {
        min_min = $2;
        max_min = $2;
        min_max = $3;
        max_max = $3;
    } else {
        if ($2 < min_min) { min_min = $2; }
        if ($2 > max_min) { max_min = $2; }
        if ($3 < min_max) { min_max = $3; }
        if ($3 > max_max) { max_max = $3; }
    }

    count_arr[$1]++;
    sum_min_arr[$1] += $2;
    sum_max_arr[$1] += $3;
    if (count_arr[$1] == 1) {
        min_min_arr[$1] = $2;
        max_min_arr[$1] = $2;
        min_max_arr[$1] = $3;
        max_max_arr[$1] = $3;
    } else {
        if ($2 < min_min_arr[$1]) { min_min_arr[$1] = $2; }
        if ($2 > max_min_arr[$1]) { max_min_arr[$1] = $2; }
        if ($3 < min_max_arr[$1]) { min_max_arr[$1] = $3; }
        if ($3 > max_max_arr[$1]) { max_max_arr[$1] = $3; }
    }
}

END {
    print "Overall:"
    print "   Total records = " count
    print "   Sum of minima = " sum_min
    print "   Sum of maxima = " sum_max
    if (count > 0) {
        print "   Min of minima = " min_min
        print "   Max of minima = " max_min
        print "   Min of maxima = " min_max
        print "   Max of maxima = " max_max
        print "   Avg of minima = " sum_min / count
        print "   Avg of maxima = " sum_max / count
    }
    for (task in count_arr) {
       print "Function " task ":"
        print "   Total records = " count_arr[task]
        print "   Sum of minima = " sum_min_arr[task]
        print "   Sum of maxima = " sum_max_arr[task]
        print "   Min of minima = " min_min_arr[task]
        print "   Max of minima = " max_min_arr[task]
        print "   Min of maxima = " min_max_arr[task]
        print "   Max of maxima = " max_max_arr[task]
        print "   Avg of minima = " sum_min_arr[task] / count_arr[task]
        print "   Avg of maxima = " sum_max_arr[task] / count_arr[task]
    }
}

Сохранение этого скрипта в qq.awk и помещение ваших примеров данных в qq.in с последующим запуском:

awk -F, -f qq.awk qq.in

генерирует следующий вывод, который, я уверен, даст вам все возможные фрагменты информации, которые вам нужны:

Overall:
   Total records = 7
   Sum of minima = 2930
   Sum of maxima = 5120
   Min of minima = 200
   Max of minima = 700
   Min of maxima = 600
   Max of maxima = 1000
   Avg of minima = 418.571
   Avg of maxima = 731.429
Function getStage:
   Total records = 3
   Sum of minima = 1900
   Sum of maxima = 2600
   Min of minima = 600
   Max of minima = 700
   Min of maxima = 800
   Max of maxima = 1000
   Avg of minima = 633.333
   Avg of maxima = 866.667
Function getInfo:
   Total records = 4
   Sum of minima = 1030
   Sum of maxima = 2520
   Min of minima = 200
   Max of minima = 300
   Min of maxima = 600
   Max of maxima = 700
   Avg of minima = 257.5
   Avg of maxima = 630
0 голосов
/ 26 августа 2011

Если вы настаиваете на Awk ...

$ awk -F, '
> func newmin(fname, array, value) { if (!(fname in array) || array[fname]>value) array[fname] = value }
> func newmax(fname, array, value) { if (!(fname in array) || array[fname]<value) array[fname] = value }
> NR>1 {
>   newmin($1,min2,$2)
>   newmin("global",min2,$2)
>   newmax($1,max2,$2)
>   newmax("global",max2,$2)
>   newmin($1,min3,$3)
>   newmin("global",min3,$3)
>   newmax($1,max3,$3)
>   newmax("global",max3,$3)
> }
> END { for (fname in min2) { print fname, min2[fname], max2[fname], min3[fname], max3[fname] } }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...