IS lab. 김건영 http://hagazzusa.github.io/ Awk, Posting list IS lab. 김건영 http://hagazzusa.github.io/
Sed? Awk? 공통적으로 데이터 가공을 위한 텍스트 처리 유틸 프로그램 리눅스 쉘 환경에서 지원함 표준입력 표준출력 (stdout, stdin) 사용으로 원본파일을 건들이 지 않음 간단하게 말하자면 Sed: 비대화형 텍스트 편집기 Awk: 필드 단위의 패턴 처리기 주로 Sed를 이용해 raw data를 가공하고 awk를 이용해 원하는 형태로 만듬
Awk가 처리할 수 있는 데이터의 형식 필드 구분자 : □ 레코드 구분자 : \n $0은 레코드 한줄
Awk 실습 자료 Mkdir awk Cd awk Cp /home/gykim/awk/awk00[띄어쓰기]. 필드 구분자 : \t, 레코드 구분자: \n Awk의 기본 필드 구분자는 스페이스
Awk 기본 사용법 Awk [-f awk스크립트파일] [-F 필드구분자] [awk스크립 트] [처리할 파일의 주소] ex) awk ‘/indian/{print}’ awk00 = awk ‘/indian/’ awk00 : indian이 있는 레코드만 출력
Awk script – 이건 안쳐도 됨 Sed 와 비슷하게 /pattern/{actions}으로 구성 그러나 편집기능은 적고 데이터를 활용하는데 더 많은 기능이 있다. 단어의 빈도 수를 세는 스크립트
$0? $1?, Awk 내부변수 Awk에는 필드단위 데이터 처리를 위한 내부 변수들이 존재한다. 변수명 변수 내용 FS Fields Seperator (필드 구분자) RS Recodes Seperator (레코드 구분자) NF Number of Fields (현재 레코드의 필드 수) NR Number of Records (현재 파일에서 레코드 넘버) FNR 입력파일이 여러 개인 경우에 현재파일에서의 NF를 표시. OFS 출력시의 FS(Ouput Fidels Seperator). ORS 출력시의 RF(Ouput Records Seperator). $0 한 줄의 레코드 전체 $n 레코드(한 줄)의 n번째 필드값
Awk 내부 변수와 model SED와 마찬가지로 줄 단위 처리임을 알 수 있다.
필드 구분자 교체하기 기본 필드 구분자는 스페이스이므로 탭으로 교체해주면 name에 해당하는 필드들이 제대로 나온다. 혹은 –F 옵션으로 “\t” 를 넘겨주면 된다.
Model : BEGIN, ROUTINE, END 보통 BEGIN에서는 환경설정을, 루틴에서는 줄단위로 처리하면서 할 행동을 END에서는 앞서 한 액션들을 종합하여 정리한다.
Awk – print Awk ‘{print “hellow world!”}’ 줄 단위 처리인 만큼 줄 개수 만큼 출력 줄 단위 처리인 만큼 줄 개수 만큼 출력 BEGIN은 ROUTINE시작 전 한번 이므로 한 번 출력 Routine에서 패턴을 앞에 붙이면 Pizza가 들어가는 줄 개수만큼만 출력
Awk - printf 형식지정자 종류들 변환 문자 정의 c 문자 lx long 16진수 s 문자열 o 8진수 d 10진수 ld long 10진수 e 지정한 표기에서 float u unsignwd 10진수 f float(실수) lu long unsignwd 10진수 g e 또는 f를 사용한 실수로 적어도 공백을 가진다 x 16진수
Awk - printf {printf “string”, arguments} Indian이 들어가는 레코드의 id와 이름을 포맷에 맞추어 출력하는 예제 다른 언어와 마찬가지로 공백지정가능
Awk – variable 필드의 개수를 세는 예제 변수의 배정(assignment)을 하지 않고 사용할 경우 NULL으로 간주함 NULL += 1 => 1
Awk – array Awk의 array는 hashmap(dictionary)의 형태 ex) id[“김건영”] = 13422 index의 타입은 상관없음 Name을 index로 가지는 id 배열을 만들어 END에서 name이 Taj Tandoori인 가게의 id를 출력하는 예제
Awk - 조건문 If (condition) action else if (condition) action else action Food의 종류에 따른 if-else 예제 Pipe가능
Awk – 반복문, while While(condition) action ROUTINE에서 줄 마다 name배열에 이름을 저장한 후 i++, END에서 while문을 이용하여 j가 레코드 숫자보다 적을 동안 name 원소들을 출력해줌
Awk – 반복문, for For(expr; condition; expr) action 앞선 while문 예제와 같은 문제 k=NULL 혹은 k만 써야 제대로 작동함 0 넣으면 name이 나오지 않음
Awk – 반복문, foreach for (variable in array) variable에는 array의 index가 순차적으로 할당된다. 들어온 순서를 보장하지 않음 Id를 index로 가지는 name배열을 순회하는 예제
Awk- 내장함수 Length(x) : x의 철자 수 반환 이외에도 지원하는 많은 내장 함수들이 존재 자세한건 https://ko.wikibooks.org/wiki/GNU_Awk_%EC%82 %AC%EC%9A%A9%EC%9E%90_%EA%B0%80%EC% 9D%B4%EB%93%9C/%ED%95%A8%EC%88%98
Awk – 사용자 정의 함수 Function name(arg1, arg2 …){ body return value; } 함수정의예시
Posting list 단어가 인덱스가 되고 값이 문서의 번호가 되는 리스트
Posting list script
documents Cd Cp -rf /home/gykim/posting_list[띄어쓰기].
스크립트 설명 BEGIN 부분 : FS와 RS를 명시하고 파일이름 저장을 위 한 배열 files의 인덱스를 담당하는 filecnt를 0으로 초기 화 ROUTINE 부분 : files에 파일이름을 저장하고 origin vocab에는 “파일이름#단어”를 인덱스로 하여 값은 단어 가 등장한 횟수가 됨 END 부분: var는 “파일이름#단어"가 되고 split 함수를 이용하여 temp[1] = 파일이름, temp[2] = 단어로 만듬 이후 posting_list, term_freq의 인덱스를 단어로 하여 완 성함
제출안내 포스팅 리스트 작성 스크립트와 해당 결과를 스크린샷으 로 찍어서 gyk@kangwon.ac.kr 로 보내주세요. 구글 이메일 아닙니다. 제목은 [학번]posting list로 해주시면 됩니다. 출석은 제출로 대신합니다.