2011-08-22 6 views
2

awk을 사용하여 일부 CSV 파일을 구문 분석하려고합니다.awk를 사용하여 파일에서 모든 통계 관련 정보를 얻으려면 어떻게해야합니까?

나는 다음과 같다 함께 일하고 CSV 파일 :

나는 모든 데이터와 각 기능에 걸쳐 모두 열 2와 3의 최소, 최대 및 평균 수치를 찾을 필요가
fnName,minAccessTime,maxAccessTime 
getInfo,300,600 
getStage,600,800 
getStage,600,800 
getInfo,250,620 
getInfo,200,700 
getStage,700,1000 
getInfo,280,600 

.

답변

4

awk 스크립트는 원하는 것을 얻기 위해 필요한 모든 기술을 제공해야합니다.

기본적으로 두 번째 필드가 minAccessTime (CSV 헤더) 인 파일은 무시하고 입력 파일의 모든 행을 실행합니다.

다른 모든 레코드에서 최소 최소값, 최대 값 최소값, 최대 값 최소값, 최대 값 최대 값, 최소값 합계 및 sum of of- 전체 데이터와 각 개별 함수 이름에 대한 최대 값.

전자를

count, min_min, max_min, min_max, max_max, sum_max sum_min 및 저장된다. 후자는 비슷한 이름을 가진 연관 배열에 저장됩니다 ( _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 

내가 상대적으로 확신 다음과 같은 출력을, 당신에게 정보의 가능한 모든 부분을 줄 것이다 발생하면 난 당신이 비 AWK 솔루션을 찾고하지 않을 실현

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 
6

을,하지만 난 DEM 일부 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 
0

당신이 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] } }' 
관련 문제