본문 바로가기

프로그래밍/awk

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가 포함된 모든 행
awk '/west*/' sales

결과
hwest 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

2. north로 시작하는 모든 행
awk '/^north*/' sales

결과
northeast NE AM Main Jr.  5.1 .94 3 13
north        NO Nargot Weber  4.5 .89 5 9

3. no나 so로 시작하는 모든 행
awk '/^no*|^so*/' sales

결과
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
northeast NE AM Main Jr.  5.1 .94 3 13
north        NO Nargot Weber  4.5 .89 5 9


4. 첫 번째 필드에 대문자 E나 소문자 e가 포함된 모든 행
awk '/^E|^e/' sales

eastern     EA    TB Savage               4.4 .84   5   20

5. 첫 번째 필드에 대문자 E나 소문자 e가 포함되지 않은 모든 행의 첫 번째와 두 번째 필드
awk '$1 !~ /^[Ee]/ {print $1, $2}' sales

hwest NW
western WE
southwest SW
southern SO
southeast SE
northeast NE
north NO
central CT

6. 7번째 필드가 5인 모든 행
awk '$7 == 5 {print $0}' sales

western    WE   Sharon Gray            5.3   .97   5      23
eastern     EA    TB Savage               4.4 .84   5   20
north        NO Nargot Weber  4.5 .89 5 9
central      CT Ann Stephens  5.7 .94 5 13

7. 2번째 필드가 CT인 행의 첫 번째와 두 번째 필드
awk '$2=="CT" {print $1, $2}' sales

central CT

8. 7번째 필드가 5보다 작은 네 번째와 일곱 번째 필드
awk '$7 < 5 {print $4, $7}' sales

Main 3
Salsaaa 2
Chin 4
Hemenway 4
Main .94



9. 8번째 필드가 10보다 크고 17보다 작은 모든 행
awk '($8 > 10) && ($8 <17) {print $0}' sales

southern        SO Suan Chin            5.1     .95     4   15
northeast       NE AM MainJr.           5.1     .94     3       13
central         CT Ann Stephens         5.7     .94     5       13


10. north로 시작하는 모든 행과 행의 개수
awk '$1 ~/^north/ {print $0; print NR}' sales

northeast       NE AM MainJr.           5.1     .94     3       13
7
north           NO Nargot Weber         4.5     .89     5       9
8

11. north로 시작하지 않는 모든 행과 행 번호
awk '$1 !~ /^north/ {print $0; print NR}' sales

hwest           NW Charles Main         3.0     .98     3   34
1
western         WE Sharon Gray  5.3     .97     5   23
2
southwest       SW Lewis Salsaaa        2.7     .8      2   18
3
southern        SO Suan Chin            5.1     .95     4   15
4
southeast       SE Patricia Hemenway 4.0        .7      4   17
5
eastern         EA TB Savage            4.4     .84     5   20
6
central         CT Ann Stephens         5.7     .94     5       13
9

12. 3번째에서 5번째 사이에 포함된 모든 행

awk 'NR>3 && NR<5 {print $0}' sales

southern        SO Suan Chin            5.1     .95     4   15


B. donors 사용

1. 전화번호 출력
awk '{split($0,token,":");print token[2]}' donors

(510) 548-1278
(408) 538-2358
(206) 654-6279
(206) 548-1348
(206) 548-1278
(916) 343-6410
(406) 298-7744
(206) 548-1278
(916) 348-4278
(510) 548-5258
(408) 926-3456
(916) 440-1763

2. Dan의 전화번호 출력
 awk '$1 == "Dan" {split($0,token,":");print token[2]}' donors

(406) 298-7744

3. Susan의 성(first name)과 전화번호 출력
awk '$1 == "Susan" {split($0,token,":");split($2,token2,":");print token2[1];print token[2]}' donors

Dalsass
(206) 654-6279


4. D로 시작하는 성(first name) 출력
awk '$2 ~/^D/' donors

Christian Dobbings:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50

5. C나 E로 시작하는 이름(second name) 출력
awk '$1 ~/^[CE]/' donors

Christian Dobbings:(408) 538-2358:155:90:201
Chet Main:(510) 548-5258:50:95:135
Elizabeth Stachelin:(916) 440-1763:175:75:300

6. 네 개의 문자로만 구성된 이름 출력
awk '{split($0,token," ");len = length(token[1]); if(len==4) print token[1]}' donors

Mike
Jody
John
Chet

7. 지역번호가 916인 사람들의 이름 출력
awk '{split($0,token,":");split(token[2],token2," "); if(token2[1]=="(916)") print $1}' donors

Guy
John
Elizabeth

8. Mike의 기부금 출력
awk '$1 == "Mike" {split($0,token,":");print token[3];print token[4]}' donors

100
175


9. first name, 쉼표, second name 순서로 이름 출력

awk '{split($0,token,":");split(token[1],token2," "); print token2[1]","token2[2]}' donors

Mike,Harrington
Christian,Dobbings
Susan,Dalsass
Archie,McNichol
Jody,Savage
Guy,Quigley
Dan,Savage
Nancy,McNeil
John,Goldenrod
Chet,Main
Tom,Savage
Elizabeth,Stachelin



10. 첫 번째 달에 100달러 이상 기부한 사람들의 이름 출력
awk '{split($0,token,":"); if(token[3]>=100) print $1}' donors

Mike
Christian
Susan
Archie
Guy
Dan
Nancy
John
Tom
Elizabeth


11. 첫 번째 달에 60달러 이하 기부한 사람들의 전체 레코드 출력
awk '{split($0,token,":"); if(token[3]<60) print $0}' donors

Jody Savage:(206) 548-1278:15:188:150
Chet Main:(510) 548-5258:50:95:135

12. 3개월 동안 800달러 이상 기부한 사람들의 이름과 액수 출력

awk '{split($0,token,":"); if((token[3]+token[4]+token[5])>800) print $1" "token[3]" "token[4]" "token[5];}' donors

Dan 450 300 275

13. 매월 150달러 이상 기부한 사람들의 이름과 전화번호, 액수 출력

awk '{split($0,token,":"); if((token[3]>=150)&&(token[4]>=150)&&(token[5]>150)) print $1" "token[2]" "token[3]" "token[4]" "token[5];}' donors

Dan (406) 298-7744 450 300 275
Tom (408) 926-3456 250 168 200



14. 레코드의 번호와 필드 개수를 행 앞에 표시
awk '{print NR" "NF" "$0;}' donors

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



15. 사람들의 이름과 총 기부 금액 출력
awk '{split($0,token,":"); print $1" "token[3]+token[4]+token[5];}' donors
Mike 275
Christian 446
Susan 360
Archie 525
Jody 353
Guy 525
Dan 1025
Nancy 405
John 525
Chet 280
Tom 618
Elizabeth 550

반응형