2014-04-22 9 views
1

유닉스에서 CSV 파일을 분할하고 일부 열에서 집계를 실행하고 싶습니다. 가능하다면 awk를 사용하여 분할 된 파일 각각에 대해 여러 열로 그룹화하려고합니다.AWK에서 SQL과 같은 그룹을 수행하려면 어떻게해야합니까? 다른 열의 집계를 계산할 수 있습니까?

누구나 할 수있는 유닉스 마법을 알고 있습니까?

customer_id,location,house_hold_type,employed,income 
123,Florida,Head,true,100000 
124,NJ,NoHead,false,0 
125,Florida,NoHead,true,120000 
126,Florida,Head,true,72000 
127,NJ,Head,false,0 

내가 조건에 같은 그룹의 위치에 그룹화 수, house_hold_type뿐만 아니라, AVG (이익)를 얻으려면 : 여기

은 샘플 파일입니다.

어떻게 파일을 분할하고 이것을 사용하여 awk를 실행할 수 있습니까?

이것은 출력의 형식이 다를 수 있다고 예상하는 출력이지만 이것은 예상하는 전체 데이터 구조입니다. 겸손하게 정보를 제시하는 다른 방법을 받아 들일 것입니다 :

location:[counts:['Florida':3, 'NJ':2], income_avgs:['Florida':97333, 'NJ':0]] 
house_hold_type:[counts:['Head':3, 'NoHead':2], income_avgs:['Head':57333, 'NoHead':60000]] 

미리 감사드립니다.

+2

당신이 보여줄 수 어떤 결과물을 기대 하시겠습니까? –

+1

생각해 볼 또 다른 사항 - SQL 동작을 원한다면 임시 테이블에 데이터를로드하고 SQL을 실제로 사용해 보는 것이 어떻습니까? 예를 들어, Postgres는 자동 입력 열에 대해서는보기 흉합니다. 나는 당신의 입력에서 어떤 날짜도 보지 못하고 당신의 불리언은 이미 '참/거짓'으로 포맷되어 있습니다. 정말로해야 할 일은 문자열을 인용 한 다음 임시 테이블을 만들기 위해 둘러싸는 SQL을 제공하는 것입니다. – n0741337

+0

'R' 프로그래밍 언어를 사용해 볼 수도 있습니다. 정말 유능한 (아무 말장련도 의도하지 않은) 유스 케이스는 데이터 테이블을로드하고 상상할 수있는 모든 방법으로 데이터 테이블을 조작합니다. 예를 들어,'tapply' 함수는 여러분이 원하는 것을 정확히하기 위해 사용될 수 있습니다. – dg99

답변

1

awk는 데이터 열에 가장 적합하므로 입력 형식이 좋습니다. 출력 형식은 관리 할 수 ​​있지만, 그것은뿐만 아니라 열 출력이 훨씬 간단합니다 :

#set the input and output field separators to comma 
BEGIN { 
    FS = ","; 
    OFS = FS; 
} 

#skip the header row 
NR == 1 { 
    next; 
} 

#for all remaining rows, store counters and sums for each group 
{ 
    count[$2,$3]++; 
    sum[$2,$3] += $5; 
} 

#after all data, display the aggregates 
END { 
    print "location", "house_hold_type", "count", "avg_income"; 
    #for every key we encountered 
    for(i in count) { 
     #split the key back into "location" and "house_hold_type" 
     split(i,a,SUBSEP); 
     print a[1], a[2], count[i], sum[i]/count[i]; 
    } 
} 

샘플 입력 :

customer_id,location,house_hold_type,employed,income 
123,Florida,Head,true,100000 
124,NJ,NoHead,false,0 
125,Florida,NoHead,true,120000 
126,Florida,Head,true,72000 
127,NJ,Head,false,0 

및 출력 :

location,house_hold_type,count,avg_income 
Florida,Head,2,86000 
Florida,NoHead,1,120000 
NJ,NoHead,1,0 
NJ,Head,1,0