[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