[데이터 추출 및 가공 10] grep 사용법 2: 수십만줄의 텍스트 데이터에서 grep을 이용해 원하는 데이터를 뽑아내는 방법

Home / 데이터 추출과 가공 / [데이터 추출 및 가공 10] grep 사용법 2: 수십만줄의 텍스트 데이터에서 grep을 이용해 원하는 데이터를 뽑아내는 방법

grep 사용법 2
수십만줄의 텍스트 데이터에서 grep을 이용해 원하는 데이터를 뽑아내는 방법

먼저 아래의 링크로 가서 데이터를 내려받습니다. kaggle에 회원가입을 안하신분들은 회원가입을 한후 로그인을 해야 데이터를 내려받을 수 있습니다. 이미 설명했듯이 kaggle에서는 데이터사이언스와 관련된 데에터와 코드들이 많이 있는 사이트입니다. 상금이 걸린 데이어 사이언스 시합도 열리고는 합니다.

https://www.kaggle.com/heesoo37/120-years-of-olympic-history-athletes-and-results

내려받을 데이터는 zip파일 형식으로 압축되어 있습니다. 일단 unzip커맨드를 사용해서 압축을 풀어야하겠습니다. 아래의 코맨드를 실행하면 120-years-of-olympic-history-athletes-and-results.zip 파일안에 압툭되어 있는 athlete_events.csv 와 noc_regions.csv 파일을 빼냅니다.

unzip 120-years-of-olympic-history-athletes-and-results.zip

Archive: 120-years-of-olympic-history-athletes-and-results.zip
inflating: noc_regions.csv
inflating: athlete_events.csv

우리가 다룰 athlete_events.csv에는 120년간 올림픽에 참가한 선수의 정보를 담고 있습니다. 중복된 선수들고 있겠지만 무려 27만여개의 정보가 저장되어 있습니다. Excel로 열어서 이만큼 많은 정보를 포함하고 있다는 것을 확인랗 수도 있지만, 지난 글에서 설명했듯이 wc 커맨드를 -l 옵션과 함께 사용하면 파일안에 얼마나 많은 줄이 포함되어 있는지를 확일할 수 있습니다.

wc -l athlete_events.csv

271117 athlete_events.csv

그중에서 금메달을 딴 사람의 정보만 골라 낼려고 합니다. 일단 파일의 처음부분을 보고 어떤 정보가 있는지 파악해야하겠습니다. 이때 쓸 수 있는 커맨드는 head입니다.

head athlete_events.csv

"ID","Name","Sex","Age","Height","Weight","Team","NOC","Games","Year","Season","City","Sport","Event","Medal"
"1","A Dijiang","M",24,180,80,"China","CHN","1992 Summer",1992,"Summer","Barcelona","Basketball","Basketball Men's Basketball",NA
"2","A Lamusi","M",23,170,60,"China","CHN","2012 Summer",2012,"Summer","London","Judo","Judo Men's Extra-Lightweight",NA
"3","Gunnar Nielsen Aaby","M",24,NA,NA,"Denmark","DEN","1920 Summer",1920,"Summer","Antwerpen","Football","Football Men's Football",NA
"4","Edgar Lindenau Aabye","M",34,NA,NA,"Denmark/Sweden","DEN","1900 Summer",1900,"Summer","Paris","Tug-Of-War","Tug-Of-War Men's Tug-Of-War","Gold"
"5","Christine Jacoba Aaftink","F",21,185,82,"Netherlands","NED","1988 Winter",1988,"Winter","Calgary","Speed Skating","Speed Skating Women's 500 metres",NA
"5","Christine Jacoba Aaftink","F",21,185,82,"Netherlands","NED","1988 Winter",1988,"Winter","Calgary","Speed Skating","Speed Skating Women's 1,000 metres",NA
"5","Christine Jacoba Aaftink","F",25,185,82,"Netherlands","NED","1992 Winter",1992,"Winter","Albertville","Speed Skating","Speed Skating Women's 500 metres",NA
"5","Christine Jacoba Aaftink","F",25,185,82,"Netherlands","NED","1992 Winter",1992,"Winter","Albertville","Speed Skating","Speed Skating Women's 1,000 metres",NA
"5","Christine Jacoba Aaftink","F",27,185,82,"Netherlands","NED","1994 Winter",1994,"Winter","Lillehammer","Speed Skating","Speed Skating Women's 500 metres",NA

첫줄을 보면 어떤 항목들이 있는지 알 수 있는데 맨마지막에 따옴표로 묶어있는 Medal이라는 항목이 있습니다. 각 줄에서 이항목을 살펴보면 금메달을 딴 사람이 어떻게 표시되어있는지를 알 수 있습니다. 위에서 다섯번째 줄의 맨 마지막을 보면 “Gold”라고 적혀있습니다. 금메달을 딴사람은 “Gold”라고 적어놓았음을 알 수 있습니다. csv파일에서는 숫자가 아닌 텍스트를 따옴표로 묶는 경우가 많습니다. 이경우도 그렇습니다.

이제 grep을 이용해서 금메달을 딴 사람의 정보만 모아보겠습니다. “Gold”라는 텍스트를 찾으면 되겠습니다. 큰 따옴표까지 텍스트에 포함하려면 이를 작을 따옴표로 묶어주면됩니다. 반대로 작은 따옴표까지 텍스트에 포함하는 경우는 큰 따옴표로 묶어주면 됩니다. 따라서 grep ‘”Gold”‘ 라는 커맨드를 쓰면 되겠습니다. 앞에 cat athlete_events.csv 커맨드를 적은 다음, 파이프(|)로 grep 커맨드에 넘길 수도 있지만, grep 커맨드 맨 끝에 바로 파일이름을 붙여서 실행해도 됩니다.

grep '"Gold"' athlete_events.csv

"3567","An Byeong-Geun","M",22,172,78,"South Korea","KOR","1984 Summer",1984,"Summer","Los Angeles","Judo","Judo Men's Lightweight","Gold"
"3581","An Han-Bong","M",23,163,62,"South Korea","KOR","1992 Summer",1992,"Summer","Barcelona","Wrestling","Wrestling Men's Bantamweight, Greco-Roman","Gold"
"3593","An Kum-Ae","F",32,160,52,"North Korea","PRK","2012 Summer",2012,"Summer","London","Judo","Judo Women's Half-Lightweight","Gold"
"3595","An Sang-Mi","F",18,155,48,"South Korea","KOR","1998 Winter",1998,"Winter","Nagano","Short Track Speed Skating","Short Track Speed Skating Women's 3,000 metres Relay","Gold"
...
"133479","Yun Mi-Jin","F",17,167,55,"South Korea","KOR","2000 Summer",2000,"Summer","Sydney","Archery","Archery Women's Team","Gold"
"133479","Yun Mi-Jin","F",21,167,55,"South Korea","KOR","2004 Summer",2004,"Summer","Athina","Archery","Archery Women's Team","Gold"
"133483","Yun Ok-Hui","F",23,162,63,"South Korea","KOR","2008 Summer",2008,"Summer","Beijing","Archery","Archery Women's Team","Gold"
"133496","Yun Yeong-Suk","F",17,170,68,"South Korea","KOR","1988 Summer",1988,"Summer","Seoul","Archery","Archery Women's Team","Gold"

여전히 많은 결과가 나옵니다. 일단은 얼마나 많은 결과를 출력하는지 위의 커맨드를 파이프(|)로 wc -l 커맨드로 넘겨 보겠습니다.

grep '"Gold"' athlete_events.csv |  wc -l

만삼천줄이 넘는 결과가 나오는 것을 확인할 수 있습니다. 이중에서 한국선수들의 결과만 걸러보겠습니다. 한국은 영어로 Korea를 포함하고 있을 것이므로 금메달을 딴 사람 결과에서 다시 Korea를 포함하는 결과를 찾아보겠습니다. 그럴려면 “Gold”를 찾은 결과를 파이프(|)로 넘겨 grep “Korea” 커맨드를 생행하면 됩니다. “Gold”로 걸른 결과에서 다시 Korea로 걸르는 겁니다.

grep '"Gold"' athlete_events.csv | grep 'Korea'

결과를 잘 살펴보면 South Korea도 있고 North Korea도 있음을 알 수 있습니다. 남한만 골라낼려고 하면 바로 옆에 있는 국가코드인 KOR를 이용해야 하겠습니다. 따라서 마지막 커맨드에 Korea 대신 KOR을 씁니다.

grep '"Gold"' athlete_events.csv | grep 'KOR'

얼마나 많은 결과를 출력하는지를 살펴보려면 이 경우도 wc -l 커맨드를 사용하면 되겠습니다.

grep '"Gold"' athlete_events.csv | grep 'KOR' | wc -l

221

총 221개의 결과가 나왔습니다.

그중에 금메달을 딴 선수가 가장 많은 종목은 어떤 종목일까요? 아마 쇼트트랙이나 양궁일 가능성이 높습니다. 먼저 쇼트트랙으로 한번 더 걸러보겠습니다. 위의 결과를 보면 알 수 있듯이 쇼트트랙은 Short Track이라는 단어가 들어가 있습니다. 다시 한번 더 grep을 써서 “Short Track”이 있는 결과를 걸러보겠습니다.

grep '"Gold"' athlete_events.csv | grep 'KOR' | grep 'Short Track'

결과가 좀 더 줄어듭니다. wc -l 커맨드를 다시 붙여서 몇개의 결과가 나오는지 보겠습미다.

grep '"Gold"' athlete_events.csv | grep 'KOR' | grep 'Short Track' | wc -l

45

결과는 모두 45개임을 알 수 있습니다. 쇼트트랙의 금매달 갯수가 45개라기보다는 금메달을 딴 사람 수가 45명임을 뜻합니다.

양궁의 결과도 한번 보겠습니다. 양궁은 Archery로 찾으면 됩니다.

grep '"Gold"' athlete_events.csv | grep 'KOR' | grep 'Archery' | wc -l

49
양궁의 금메달 수가 총 49개로 더 많습니다.

그러면 금메달, 은메달, 동메달을 모두 합친 결과는 어떨까요? 이때는 “Gold”, “Silver”, “Bronze” 셋중에 하나만 나오면 됩니다. 이렇게 여러개중에 하나만 나오면 되는 경우는 텍스트사이에 |기호를 넣으면 됩니다. 그런데 이걸로만을 안됩니다. grep 커맨드 다음에 -E 옵션을 붙여줘야합니다.

grep -E '"Gold"|"Silver"|"Bronze"' athlete_events.csv | grep 'KOR' | grep 'Short Track' | wc -l
grep -E '"Gold"|"Silver"|"Bronze"' athlete_events.csv | grep 'KOR' | grep 'Archery' | wc -l

73
69

이번에는 쇼트트랙에서 메달을 딴사람이 더 많습니다.

이렇게 큰 용량의 텍스트 데이터에 grep커맨드를 적용하면 원하는 결과를 매우 빠르게 걸러낼 수 있습니다.