1 쉘이냐 프로그램이냐

데이터를 처리하는 입장에서 쉘(shell) 스크립트를 통해 작업을 수행하는 방식과 파이썬 혹은 R 코드를 작성해서 처리하는 방식으로 나뉜다. 과연 어떤 방식이 좋을까? 답은 아마도 상황에 따라 다르다가 될 것이다.

한줄 쉘 스크립트를 .sh 쉘파일을 제작해서 처리하는 방식과 범용 프로그래밍 언어 파이썬이나 R 프로그램을 작성하여 쉘에 실행하는 방식이 대안이 된다.

2 한줄 쉘 스크립트 작성

구텐베르그에서 책을 한권 다운로드 받아 가장 많이 사용된 고빈도 단어를 추출하는 프로그램을 작성한다. 불용어(stopwords)는 stopwords.txt 파일을 참조하여 제거한다.

6439 and
5077 the
3666 i
3258 a
3022 to
2567 it
2086 t
2044 was
1847 he
1777 of
  • curl -s http://www.gutenberg.org/files/76/76-0.txt : 구텐베르그 웹사이트에서 Huckleberry Finn 책 다운로드
  • tr '[:upper:]' '[:lower:]' : 대문자를 소문자 변환
  • grep -oE '\w+' : 단어를 쪼개서 한줄에 한단어를 위치시킴
  • sort : 알파벳 순으로 정렬
  • uniq -c : 유일무이한 단어 추출 후 중복단어 빈도수 작성
  • sort -nr : 빈도별로 내림차순 정렬
  • head -n 10 : 상위 단어 10개 추출

3 함수 .sh 파일 작성

쉘 명령어가 파이프로 연결되어 매우 길어져서 이를 하나의 함수로 묶을 필요가 있다. 이때 .sh 쉘 명령어로 만들어 문제를 해결한다.

word_count.sh 원본

화장을 전혀하지 않은 원본 .sh 스크립트를 작성한다. 이에 대한 기능을 테스트한다.

script/wordcount.sh 파일로 그대로 복사하여 붙여넣고 bash 명령어를 통해서 실행시키게 되면 된다. 하지만 아무래도 유연성이 많이 떨어져서 다음과 같이 몇가지 추가 작업을 하게 되면 훨씬 우아하게 코드를 작성하게 된다.

6439 and
5077 the
3666 i
3258 a
3022 to
2567 it
2086 t
2044 was
1847 he
1777 of

개선된 wordcount2.sh 코드

쉬뱅을 추가하여 bash 스크립트를 해석하여 실행시키도록 명시한다. NUM_WORDS="$1"와 같은 매개변수를 적용시켜 구텐베르그 책은 어떤 것이든 가져와서 단어빈도수를 지정된 순위까지 출력하도록 한다.

  1. 쉬뱅(shebang #!) 추가: #! /bin/env bash
  2. 매개변수를 넘겨 재사용성을 높인다.

script/wordcount2.sh를 실행시키게 되면 두가지 매개변수 즉, 책과 상위 빈도수 단어갯수를 지정해줘야 정상 동작하게 된다.

6439 and
5077 the
3666 i
3258 a
3022 to

한걸음 더 나아가 chmod u+x script/wordcount2.sh와 같이 실행가능한 기능을 부여하게 되면 bash를 앞에 붙일 필요없이 쉘에서 바로 실행이 가능하게 된다.

4 파이썬 .py 파일 작성

동일하게 텍스트 책을 받아 고빈도 단어를 계산해 내는 파이썬 프로그램도 작성이 가능하다.

상위 7개 단어만 출력하도록 파이썬 스크립트를 작성한다. 물론 그 이전에 script/wordcount.py 파일을 실행가능한 형태로 권한을 변경한다. chmod u+x script/wordcount.py

------------------
인자[0]: script/wordcount.py
인자[1: 7
------------------
빈도수: 6439, 단어: and
빈도수: 5077, 단어: the
빈도수: 3666, 단어: i
빈도수: 3258, 단어: a
빈도수: 3022, 단어: to
빈도수: 2567, 단어: it
빈도수: 2086, 단어: t

5 R스크립트 .R 파일 작성

동일하게 R 스크립트를 작성하여 실행시킨다.

permission denied 오류가 발생되는 경우, chmod u+x script/wordcount.R 명령어를 실행시켜 동일한 결과가 출력되는지 확인한다.

Warning messages:
1: package ‘ggplot2’ was built under R version 3.5.2 
2: package ‘ggthemes’ was built under R version 3.5.2 
   6439 and
   5077 the
   3666 i
   3258 a
   3022 to
   2567 it
   2086 t
   2044 was
   1847 he
   1777 of