테이블 데이터 처리용 command line tool들 한국어 정보의 전산 처리 2019. 4. 2.
cut 각 레코드(라인)에서 일정 부분을 잘라내어(추출하여) 출력함. <50students_ext.csv -c 1-9,11-12 : 1째~9째 문자, 11째~12째 문자 추출 한글 한 글자가 3바이트이므로, 세 글자로 된 이름과 국어 점수가 출력됨. ls -l | cut –c 1-10 : 현재 디렉토리에 있는 파일들의 permission 정보가 출력됨 스위치 -d ~: (delimiter) 필드 구분자를 ~로 지정함. default는 탭 스위치 -f : 몇번째 필드를 추출할 것인지를 지정 <50students_ext.csv -d, -f 1,8 : 필드 구분자를 쉼표(,)로 하여, 첫째 필드와 8째 필드 추출 “이름,평균”이 출력됨.
join 피벗 필드를 공유하는 2개의 파일의 각 라인을 통합함. 2개의 입력 파일은 소팅되어 있어야 함. 피벗 필드의 default는 첫째 필드 스위치 -1 필드넘버 : 첫째 파일에서 필드넘버로 지정된 필드를 피벗 필드로 함. (스위치 -2도 마찬가지) 스위치 -a 파일넘버 : (all) 파일넘버(1또는 2)로 지정된 파일에서 비교 불가능한 라인도 출력함. (복수 지정 가능: -a1 -a2) 스위치 -t 문자 : ‘문자’를 필드 구분자로 사용.
awk, gawk 테이블 형식의 데이터를 처리할 수 있는 매우 강력한 도구. BEGIN 블록, 메인 블록, END 블록으로 이루어짐. 메인 블록은 필수적. 나머지 둘은 수의적. 메인 블록에서는, 각 레코드의 각 필드들을 추출하여 처리함. $1, $2, … $n : 첫째 필드, 둘째 필드, … n째 필드. $0 : 해당 레코드 전체 NF : 해당 레코드에서 필드의 수. NR: 레코드넘버 print $3,$2,$1 : 셋째 필드, 둘째 필드, 첫째 필드를 (이 순서대로) 출력 print $0,$2+$3 : 해당 레코드를 통째로 출력하고, 그 뒤에 둘째 필드와 셋째 필드를 더 한 값을 출력함. print 함수 실행시 쉼표 부분에는 OFS가 출력되고 맨 끝에는 ORS가 출력됨. printf 함수의 경우, 필드 구분자, 레코드 구분자가 자동 출력되지 않음. BEGIN 블록에서는 입력 및 출력시의 레코드 구분자, 필드 구분자 등을 지정 할 수 있음. RS 입력 레코드 구분자, FS 입력 필드 구분자 (스위치 “-F 구분자”로도 지정 가능) ORS 출력 레코드 구분자, OFS 출력 필드 구분자 구분자를 따로 지정하지 않으면 default는 (O)RS는 줄바꿈, (O)FS는 공백
awk, gawk 메인 블록 앞에 패턴(정규표현)을 제시하면, 각 레코드 중 이 패턴에 매치 되는 것에 대해서만 메인 블록을 실행함. <50students_ext.csv awk -F, ‘BEGIN{OFS=","}/^김/{print $0}‘ “김”으로 시작되는 라인만 출력 <50students_ext.csv awk -F, ‘BEGIN{OFS=","}$1~/^김/{print $0}‘ 첫째 필드가 “김“으로 시작되는 라인만 출력. <50students_ext.csv awk -F, 'BEGIN{OFS=","}$9~/개그맨/{print $0}‘ 9째 필드가 “개그맨”을 포함하는 라인만 출력 메인 블록 안에서 if문으로 조건을 지정할 수도 있음. <50students_ext.csv awk -F, 'BEGIN{OFS=","}{if($2>80 && $2<90)print $1}‘ 둘째 필드(국어 점수)가 80보다 크고 90보다 작은 레코드만 뽑아 첫째 필드(학생 이름) 출력 BEGIN 블록에서 변수를 지정하고, 메인 블록에서 연산을 하여, END 블록 에서 결과를 출력할 수 있음. gawk -F, 'BEGIN{OFS=",";sum=0} {sum+=$2} END{print sum,sum/NR}‘ 변수 sum을 0으로 초기화. 각 레코드의 둘째 필드를 sum에 더함. 마지막에 sum과 평균을 출력
awk, gawk 레코드/필드 구분자 지정을 통해, 비정규 포맷의 파일 처리도 가능함. thesaurus.txt는 하나의 표제항에 대한 정보가 여러 라인에 걸쳐서 제시되어 있음. 새로운 표제항으로 넘어갈 때에는 줄바꿈을 2번 함. 줄바꿈 문자를 LF로 하여 다시 저장. <thesaurus.txt awk 'BEGIN{ RS="\n\n"; ORS="\n"; FS="\n"; OFS="\t“ } { print substr($1,3), substr($2,2) }‘ 레코드 구분자는 “\n\n”, 필드 구분자는 “\n”, 출력 레코드 구분자는 “\n”, 출력 필드 구분자는 “\t”으로 지정 각 레코드에서 첫째 필드를 추출하여 셋째 문자부터, 둘째 필드를 추출하여 둘째 문자부터 출력 gawk 'BEGIN{RS="\n\n";ORS="\n";FS="\n"} $2~/@prep/{print $1}‘ 둘째 필드(품사)가 “@prep”인 경우에만 첫째 필드(표제항)를 출력 gawk 'BEGIN{RS="\n\n";ORS="\n";FS="\n";OFS="\t"}$0~/\$15/{print $1}‘ 레코드가 “$15”를 포함하는 경우(센스가 15개 이상)에만 첫째 필드(표제항) 출력
EmEditor를 이용한 테이블 자료 처리 EmEditor Professional의 편집 메뉴 안의 CSV 하위메뉴 정렬: 다양한 옵션의 sort 변환: CSV, TSV, 또는 기타 구분자 포맷 사이의 상호 변환 열(column) 선택 열 추출하기 join : 피벗 열(고유 키) 선택 가능. 일치하지 않는 행 선택 가능 필터 기능: 특정 조건을 만족하는 레코드만 추출
csvkit 테이블 형식, 특히 csv 파일을 처리하는 데 특화된 도구. 파이썬으로 작성. 설치 방법 필드 구분자는 default로 쉼표 입력 파일의 첫째 라인은 header임을 전제로 함. 이 header를 적극 이용. 설치 방법 python -m ensurepip (pip이 설치되어 있는지 확인) sudo pip install -U pip (pip을 최신 버전으로 업데이트) sudo pip install csvkit (pip을 이용하여 csvkit를 다운로드하여 설치) 유닉스의 기본 command line tool과 비슷하면서 csv 파일 처리에 특화 된 도구들 제공: csvsort, csvgrep, csvcut, csvjoin 기타 도구들 csvstack : 복수의 csv 파일들을 수직으로 통합. (참고: join은 수평 통합) csvstat : 각 필드에 대한 통계 정보 제공. R의 summary 함수와 비슷. csvsql : csv 파일을 관계형 DB처럼 취급하여 SQL 쿼리를 적용함. csvlook : csv 파일을 표 모양으로 예쁘게 출력함.
in2csv, csvlook, csvclean 지원하는 입력 파일 엑셀 파일: .xls .xlsx JSON 파일 고정폭 포맷 파일(fixed-width formatted file) default 출력은 standard output(화면) redirection (>)으로 결과를 파일로 저장 csvlook : command line에서 csv 파일을 표 모양으로 보여줌. 입력 파일의 필드가 너무 많아 화면에 다 들어오지 않을 경우 <input csvlook | less -S 화면 wrapping 없이, 화살표 키와 page down 키 등으로 navigate csvclean : 입력파일의 오류를 찾아내고 수정해 줌. https://csvkit.readthedocs.io/en/1.0.1/index.html
csvcut 입력 파일의 특정 필드를 추출, 재배열 스위치 -n : (name) 각 필드의 title을 출력 스위치 -c : (column) 특정 필드를 지정하여 추출 필드 지정 방법 1: 필드넘버 : csvcut -c 1,8,9 : 1,8,9째 필드 추출 필드 지정 방법 2: 필드이름 : csvcut -c name,avg,job : 이름, 평균, 직업 필드 추 출 일반 command line tool인 cut과 매우 유사하나 필드넘버 대신 필드이름을 사용하여 필드를 지정할 수 있다는 장점이 있 음. csvkit의 여러 tool 중 가장 먼저 개발되었고 csvkit의 나머지 tool에 대한 아이디어, 모델을 제공하였음.
csvgrep 특정 필드에 대해, 특정 문자열이나 정규표현을 포함하는지 검사하여 매치되는 레코드만 출력 특정 필드에 대해, 특정 문자열이나 정규표현을 포함하는지 검사하여 매치되는 레코드만 출력 <50students_ext.csv csvgrep -c avg -m 76 스위치 -m : (match) 단순 문자열 일치 여부 검사 avg 필드가 문자열 “76”을 포함하는 레코드만 출력 아스키 문자 이외의 문자를 사용하면 에러가 남. C:\cygwin64\lib\python2.7 디렉토리 안에 sitecustomize.py 파일이 없으면 새로 만들어 아래의 두 줄을 써 넣을 것. 이 파일이 이미 있으면 기존 파일 맨 끝에 아래의 두 줄을 첨가할 것. import sys sys.setdefaultencoding('utf-8') 이 조치를 취하면 스위치 -m(단순 문자열 매칭)에서는 잘 작동하나 스위치 - r(정규표현 매칭)에서는 여전히 제대로 작동하지 않음. <50students_ext.csv csvgrep -c sum -r 4.2 스위치 -r : (regular expression) 정규표현 일치 여부 검사 sum 필드가 정규표현 “4.2”를 포함하는 레코드만 검사
csvsort 특정 필드를 기준으로 소팅함. 필드 지정 방법은 csvcut과 동일함. (필드넘버, 필드이름) 해당 필드가 문자열인지 숫자인지 알아서 판단함. 따라서 -g, -n 같은 스위치를 지정해 줄 필요 없음. 스위치 -r : (reverse) 내림차순 소팅 <50students_ext.csv csvsort -c sum -r sum(총점) 필드를 기준으로 내림차순 소팅
csvjoin 두 개의 csv 파일을 수평으로 통합함. 피벗필드를 중심축으로 하여 두 파일 통합. 피벗필드는 한 번만 나옴.
csvstack 동일한 필드들로 이루어진 복수의 csv 파일들을 수직으로 통합함. 각 파일의 첫째 라인에 필드 이름이 있으나, 출력 파일에서 필드 이름 은 맨 앞에 한 번만 나옴. 스위치 -g f1,f2,f3,…fn : (group) 맨 앞에 group이라는 필드를 추가하 여, n번째 입력파일에서 온 레코드는 fn이라는 값을 부여함. csvstack -g m,f stu_male.csv stu_female.csv 남학생 성적 파일과 여학생 성적 파일을 수직 통합하되, 남학생은 m으로, 여학 생은 f로 표시함.
csvsql SQL (structured query language) : 관계형(relational) 데이터베이스에 서 특정 정보를 추출하기 위해 고안된 쿼리 언어. 데이터베이스 분야에서는 must-know 다양한 명령어가 있으나 가장 많이 쓰이는 것은 select select 필드 from 입력 where 조건 : 입력 테이블로부터 조건을 만족시키는 레 코드의 필드들을 추출함 csvsql은 csv 파일을 마치 관계형 DB인 것처럼 취급하여, 이로부터 sql 을 통해 원하는 정보를 추출할 수 있게 함. <50students_ext.csv csvsql --query "select * from stdin where avg > 90“ 표준입력(stdin)으로부터 avg가 90을 넘는 레코드를 추출하여 모든 필드(*) 출력