[Tmax 연수] Awk 연습문제

sales 파일

northwest NW  Charles Main      3.0 .98   3     34
western    WE   Sharon Gray            5.3   .97   5      23
southwest SW   Lewis Salsaaa        2.7   .8   2      18
southern   SO   Suan Chin              5.1   .95  4     15
southeast SE    Patricia Hemenway 4.0 .7   4   17
eastern     EA    TB Savage               4.4 .84   5   20
northeast NE AM Main Jr.  5.1 .94 3 13
north        NO Nargot Weber  4.5 .89 5 9
central      CT Ann Stephens  5.7 .94 5 13

donors 파일

Mike Harrington:(510) 548-1278:100:175
Christian Dobbings:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175
Dan Savage:(406) 298-7744:450:300:275
Nancy McNeil:(206) 548-1278:250:80:75
John Goldenrod:(916) 348-4278:250:100:175
Chet Main:(510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300

연습 문제

A. sales 사용

#### 1. west가 포함된 모든 행 #### 2. north로 시작하는 모든 행 #### 3. no나 so로 시작하는 모든 행 #### 4. 첫 번째 필드에 대문자 E나 소문자 e가 포함된 모든 행 #### 5. 첫 번째 필드에 대문자 E나 소문자 e가 포함되지 않은 모든 행의 첫 번째와 두 번째 필드 #### 6. 7번째 필드가 5인 모든 행 #### 7. 2번째 필드가 CT인 행의 첫 번째와 두 번째 필드 #### 8. 7번째 필드가 5보다 작은 네 번째와 일곱 번째 필드 #### 9. 8번째 필드가 10보다 크고 17보다 작은 모든 행 #### 10. north로 시작하는 모든 행과 행의 개수 #### 11. north로 시작하지 않는 모든 행과 행 번호 #### 12. 3번째에서 5번째 사이에 포함된 모든 행

B. donors 사용

#### 1. 전화번호 출력 #### 2. Dan의 전화번호 출력 #### 3. Susan의 성(first name)과 전화번호 출력 #### 4. D로 시작하는 성(first name) 출력 #### 5. C나 E로 시작하는 이름(second name) 출력 #### 6. 네 개의 문자로만 구성된 이름 출력 #### 7. 지역번호가 916인 사람들의 이름 출력 #### 8. Mike의 기부금 출력 #### 9. first name, 쉼표, second name 순서로 이름 출력 #### 10. 첫 번째 달에 100달러 이상 기부한 사람들의 이름 출력 #### 11. 첫 번째 달에 60달러 이하 기부한 사람들의 전체 레코드 출력 #### 12. 3개월 동안 800달러 이상 기부한 사람들의 이름과 액수 출력 #### 13. 매월 150달러 이상 기부한 사람들의 이름과 전화번호, 액수 출력 #### 14. 레코드의 번호와 필드 개수를 행 앞에 표시 #### 15. 사람들의 이름과 총 기부 금액 출력 

#!/usr/bin/awk
BEGIN {

}

{
    content[$0]++
} 

END {
        #1. 전화번호 출력
        print "1. 전화번호 출력";
        print "---------------------------------------------------";
        for ( body in content )
        {
                split(body,array,":");
                print array[2];
        }        
        print "---------------------------------------------------";
        
        #2. Dan의 전화번호 출력
        print "2. Dan의 전화번호 출력";
        print "---------------------------------------------------";
        
        for ( body in content )
        {
                split(body,line);
                if ( line[1] == "Dan" )
                {
                        split(body,array,":");
                        print array[2];
                }
        }
        print "---------------------------------------------------";

        #3. Susan의 성(first name)과 전화번호 출력
        print "3. Susan의 성(first name)과 전화번호 출력";
        print "---------------------------------------------------";
        for ( body in content )
        {
                split(body,line);
                if ( line[1] == "Susan" )
                {
                        split(body,array,":");
                        split(line[2],name,":");
                        print name[1],array[2];
                }
        }
        print "---------------------------------------------------";

        #4. D로 시작하는 성(first name) 출력
        print "4. D로 시작하는 성(first name) 출력";
        print "---------------------------------------------------";
        for ( body in content )
        {
                split(body,line);
                if ( line[2] ~/[D]/ )
                {
                        split(line[2],name,":");
                        print name[1];
                }
        }
        print "---------------------------------------------------";

        #5. C나 E로 시작하는 이름(second name) 출력
        print "5. C나 E로 시작하는 이름(second name) 출력";
        for ( body in content )
        {
                split(body,line);
                if ( line[1] ~/[CcEe]+/ )
                {
                        print line[1];
                }
        }
        print "---------------------------------------------------";

        #6. 네 개의 문자로만 구성된 이름 출력
        print "6. 네 개의 문자로만 구성된 이름 출력";
        for ( body in content )
        {
                split(body,line);
                if ( length(line[1])    == 4 )
                {
                        print line[1];
                }
        }
        print "---------------------------------------------------";

        #7. 지역번호가 916인 사람들의 이름 출력
        print "7. 지역번호가 916인 사람들의 이름 출력";
        for ( body in content )
        {
                split(body,line);
                split(body,array,":");
                split(array[2],tel, "[()]");
                match(array[2],/\([0-9]+\)/);
                dial = substr(array[2],RSTART+1,RLENGTH-2)
                if ( dial == "916" )
                {
                        split(line[2],name,":");
                        print line[1]", "name[1];
                }
        }
        print "---------------------------------------------------";
        
        #8. Mike의 기부금 출력
        print "8. Mike의 기부금 출력";
        for ( body in content )
        {
                split(body,line);
                split(body,array,":");
                
                if ( line[1] == "Mike" )
                {
                        mikeSum=array[3]+array[4]+array[5];
                        print mikeSum;
                }
        }
        print "---------------------------------------------------";
        
        #9. first name, 쉼표, second name 순서로 이름 출력
        print "9. first name, 쉼표, second name 순서로 이름 출력";
        for ( body in content )
        {
                split(body,line);
                split(line[2],name,":");
                print name[1]", "line[1];
        }
        print "---------------------------------------------------";

        #10. 첫 번째 달에 100달러 이상 기부한 사람들의 이름 출력
        print "10. 첫 번째 달에 100달러 이상 기부한 사람들의 이름 출력";
        for ( body in content )
        {
                split(body,line);
                split(body,array,":");
                if ( array[3] >= 100 )
                {
                    print line[1];
                }
        }
        print "---------------------------------------------------";

        #11. 첫 번째 달에 60달러 이하 기부한 사람들의 전체 레코드 출력
        print "11. 첫 번째 달에 60달러 이하 기부한 사람들의 전체 레코드 출력";
        for ( body in content )
        {
                split(body,array, ":");
                if ( array[3] <= 60 )
                {
                    print body;
                }
        }
        print "---------------------------------------------------";

        #12. 3개월 동안 800달러 이상 기부한 사람들의 이름과 액수 출력
        print "12. 3개월 동안 800달러 이상 기부한 사람들의 이름과 액수 출력";
        for ( body in content )
        {
                split(body,line);
                split(body,array,":");
                donerSum = array[3]+array[4]+array[5];
                if ( donerSum >= 800 )
                {
                    split(line[2],name,":");
                    print line[1]","name[1],donerSum
                }
        }
        print "---------------------------------------------------";

        #13. 매월 150달러 이상 기부한 사람들의 이름과 전화번호, 액수 출력
        print "13. 매월 150달러 이상 기부한 사람들의 이름과 전화번호, 액수 출력";
        for ( body in content )
        {
                split(body,array,":");
                split(body,line);
                sum = 0;
                for ( item in array )
                {
                    if ( item ~/[0-9]+/ && item >= 150 )
                        sum += array[item];
                }
                split(line[2],name,":");
                
                if ( sum > 0 )
                    print line[1], name[1], array[2], sum;
        }
        print "---------------------------------------------------";

        #14. 레코드의 번호와 필드 개수를 행 앞에 표시
        # awk '{column=row=1;split($0,array,":");printf "(%2d)",record++;for(item in array)printf "[%2d] %s ",column++,array[item];printf "\n";}'        record = 1;

        for ( body in content )
        {
                column = 1;
                printf "("record++") ";
                split(body,array,":");
                for ( item in array )
                {
                        printf "[%d] %s ", column++, array[item];
                }
                printf "\n"
        }
        print "---------------------------------------------------";

        #15. 사람들의 이름과 총 기부 금액 출력
        # awk '{split($0,array,":");sum=0;for(item in array) if ( item ~/[0-9]+/) sum+=array[item]; print array[1], sum;}'
        print "15. 사람들의 이름과 총 기부 금액 출력";
        for ( body in content )
        {
                split(body,line);
                split(body,array,":");
                sum = 0;
                for ( item in array )
                {
                        if ( item ~/[0-9]+/ )
                                sum += array[item];
                }
                split(line[2],name,":");
                print line[1], name[1]," Total Donation is",sum;
        }
        print "---------------------------------------------------";
}
Back