테이블데이터처리용 command line tool 들 한국어정보의전산처리 2019. 4. 2.
cut 각레코드 ( 라인 ) 에서일정부분을잘라내어 ( 추출하여 ) 출력함. 스위치 -c : 추출할부분의위치를문자 ( 바이트 ) 수로지정. <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 다양한포맷의파일을 csv 파일로변환 지원하는입력파일 엑셀파일 :.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 파일을수평으로통합함. 아무런스위치없이 ( 즉피벗필드를지정하지않고 ) join 하면, 그냥두파일을수평으로합치기만하므로, 피벗필드가두번나오게됨. csvjoin -c 피벗필드파일 1 파일 2 피벗필드를중심축으로하여두파일통합. 피벗필드는한번만나옴.
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 을넘는레코드를추출하여모든필드 (*) 출력