데이터 탐색을 위한 유용한 유닉스 명령들

2014. 9. 1. 18:03BASIC

Useful Unix commands for exploring data

http://datavu.blogspot.kr/2014/08/useful-unix-commands-for-exploring-data.html?m=1


사실... 바로 링크를 클릭해서 가셔서 봐야합니다.
(글 작성자에게 허락을 받고 퍼온글이 아니기 때문이죠;.. 물론 여쭤보긴 했는데.. 답글이 없어서 ..)

하지만 이글을 퍼온 이유는 ... 번역을 조금씩 해보기 위함이였습니다. 난이도가 높아 보이지 않기에.. 다른 분들은 꼭 영문으로 읽으면서 이해하는 것이 좋을것으로 생각합니다.

그래야 발전이 있겠지만요.. 그리고 나서 한번정도 제가 번역한 글을 읽어 주세요.. 그리고 오역이 있으면 지적을 좀 해주세요... 감사합니다. 






좀 큰 원본 데이터 세트를 가지고 일을 하는 중에

종종 이런 큰 파일을 읽는 상황에서  프로그래밍 언어의 한계에 막힐 때가 있다.

또한 종종, 기본적인 체크 및  분석 탐구 등을 실행 하기 위해 Phython 이나 R 등의 프로그램 언어 상에서 데이터를 로드 하는데 편하지가 않았습니다.
유닉스 명령어는 이런 경우에 매우 편리하고, 실행하는데 있어서 종종 두드러지게  적은 시간이 소요됩니다.

이 할당(역할수행)를 위해 몇몇의 비슷한 세계(무작위 값을 가지고)의 출처인 영화 자료 세트를 가지고 생각해 봅시다.
여기 모두 8개의 필드 가 있다.

약간의 중복 데이터들이 포함되어 있고약간의 기본 예제와 함께 시작해 봅시다.




파일 안에 컬럼 이름을 확인 해 봅시다.

head – 1 movies.csv

파일을 나타내기 위해서 Cat를 사용할 수 있으나,
파일들의 단지 첫 번째 있는 컬럼의 이름에 관심이 있죠.
따라서 우린 head 명령을 사용했습니다.

파일 안에 레코드 수를 확인 해 봅시다.
wc -| movies.csv

wc 명령어는 파일 안에 글자의 수, 단어 수 그리고 라인 수를 알려 줍니다.
우린 라인수가 관심이 있기 때문에, we –l  명령어를 사용합니다.

50번째 레코드를 체크 해 봅시다.
head –50 movies.csv | tail -1

| 라는 오퍼레이터는 파이프라고 불리고, 이건 두 번째 명령의 입력으로써,
첫 번째 명령의 결과에 추가로 전달 된다.

파이프와 마찬가지로, 결과물을 덮어쓰기 하는  > ,
파일 가장 끝의 결과물에 명령이 추가되는 >> 가지고 있다.



중복 요소를 찾아서 지워봅시다.

## 중복 찾기##

uniq –d movies.csv

## 중복 제거하기 ##

uniq – u movies.csv > uniqMovie.csv

## 새 파일 중복 이중체크 하기 ##

uniq –d uniqMovie.csv

uniq 에서, -d는 중복된 것을 찾는데 사용되어 졌고, -u 는 유일한 레코드를 찾는데 사용되어 졌습니다.
따라서 중복을 제거하기 위해, 우리는 유일한 레코드들을 선택했고, 새로운 파일로 이것들을 이동 시켰지요 (uniqMovie.csv )

혹 새 파일을 원하지 않는다면, 기존파일에 덮어 쓰기 하는 방식의 2가지 단계로 같은 파일에 결과물을 옮겨 놓을 수 있다.

이걸 위해 임시 파일을 사용 할 수 있습니다.,

uniq –u movies.csv > temp.csv

mv temp.csv movie.csv

** 중요한 점은 여기서는 만약 중복 데이터들이 근처에 있지 않으면 uniq 는 동작하지 않을 것입니다.



 

 점유율이 가장 낮은 10개 영화를 보여주세요

Sort –n –t’,’ –k3 uniqMovie.csv | head -10

# –n은 숫자 정렬 이고 사전적인 정렬은 아니라는 것을 알린다.
#-t
는 이번에 구분자를 컴마로 하겠다고 명시합니다.

#-k 는 우리 경우에선 3번째 컬럼을 가르키고 있습니다.

숫자 정렬은 1,2,15,17,130,140 이고,

사전적 정렬은 1, 120, 140, 15, 17 ,2 이다.
정렬은 기본적으로 입력에 대한 사전적 정렬이 된다는 걸 알고 있고,

내림차순 정렬을 사용하기 위해 –r 를 사용 할 수 있다.




컬럼수를 체크합니다.
awk –F “.” ‘{print NF}’ uniqMovie.csv | head -1
# -F “,” 컴마를 필드 구분자로 한다라고 명시한다.

컴마가 필드 구분자라고 명시 위해 –F 를 사용한다.
파이프를 사용함에 따라, 우리는 결과물을 head에 전달하고, (다중의 라인들에 결과물이 출력하는 것을 피하기 위한)첫번째 레코드를 선택한다.

컬럼 이름을 확인하기 위해 head 명령어를 사용했던 첫번째 명령의 결과물과 함께 이 결과를 크로스 체크 할 수 있다.

(많은 컬럼을 갖고 있거나, 컬럼수에 대해서 모를 때, 컬럼 수를 찾기 위해 awk을 더 좋아 할 것이다.

NF는 우리가 제공해온 필드 구분자를 기본으로 필드의 수의 값을 저장한다. NF와 비슷하게 우린 또한 로우의 수를 저장하고 로우 구분자로 \n를 사용하는 NR를 가지고 있다.

첫번째,두번째,여섯번째 그리고 마지막 레코드 를 가지고 오는 데이터 필터
Awk ‘BEGIN{FS=“,”;OFS=“,”;}{print $1,$2,$6,$NF}’ uniqMovie.csv > newMovie.csv

여기 우린 이전 예제에서 언급했던 NR NF와 비슷한 FS OFS 같은 빌트인 변수를 사용했다.

OFS는 새로운 파일로 작성 될 때, 모든 컬럼 사이 마다 명시된 필드 구분자가 더해질 결과물 필드 구분자이다.
$n
몇번째 컬럼인지 지정하기 위해 사용한다.



릴리즈 데이터를 기반으로 모든 달에 분리된 파일을 만들자
Tail – n +2 newMovie.csv | awk –F”,” ‘{Month = $4; print > Month”_movies.csv”}’

첫번째 줄안에 있는 컬럼이름을 제외한 4번째 컬럼 안에 모든 값의 파일을 원한다.그래서 모든 데이터를 두번째 컬럼(컬럼이름 제외하기 위해)부터 선택하도록  tail 명령을 사용한다.
여기 우리는 다양한 달의  릴리즈된 달의 모든 유니크한 값을 저장하고 그때 우린 cvs 파일안에Month관련이 있는 모든 레코드를 출력한다.
또한 모든 csv 파일에 네이밍을 위해 우리는 “_moves.csv”의해 따라오는 변수를 사용한다.



모든 영화들의 리뷰들의 평점은 무엇일까요?

Awk –F”,” ‘{colSum+=$2} END { print “Average = “,colSum/NR}’ movies.csv

여기 colSum 은 합을 저장하기 위한 변수 이고, $2 의해 구분되어진 흥미 컬럼을 루프 오버 한다.



다음 예제는 좀더 논의해 온 것을 기본으로 한다. 너가 할 수  있겠다면 봐라
상위 20개의 박스 오피스 판매의 합을 보여줘봐


힌트:

박스 오피스 판매에 따라서 레코드를 정렬한 다음, 최고 판매량으로 20개 레코드를 선택해.
그 담에 컬럼의 합을 찾은 다음, 그걸 스크린에 보여줘.

이런 예제를 풀기 위해 보다 나은 방법들을 제안하고자 정답을 뎃글 섹션에서 자유롭게 즐겨주시길


토론은 여기 해 주삼 (https://news.ycombinator.com/item?id=8232019 )


'BASIC' 카테고리의 다른 글

UML 과 방법론의 차이  (1) 2013.07.30
Cryptography, 암호 이용 활성화  (0) 2013.07.30