AWK

포스트: 23|조회수: 0|ORGANIZATION
Items

Posts

23 posts

[bash: awk] awk에서 문자열을 분할하여 배열(array)에 저장하기 (split)

반달가면|2017년 3월 9일

awk에서 문자열 작업을 할 때, 한 행의 문자열을 분할해서 배열에 저장할 수 있다. 예를 들어 한 문장이 있을 때 단어별로 쪼개서 배열의 원소로 저장하는 경우다. awk에서 제공하는 split 함수를 이용하면 된다. split 함수의 형식은 아래와 같다. split(문자열, 배열 이름, 구분자) 예를 들어 입력 받은 행($0)을 콜론(:) 기준으로 분할해서 배열 arr에 저장하고자 한다면 아래와 같이 된다. split($0, arr, ":") 배열의 원소번호(index)는 1부터 시작한다. 위의 예시에서 첫번째 원소가 arr[1]에 있다. 아래의 예시를 보자. # 문자열을 콜론을 기준으로 분할, 배열 arr에 저장한 후 세번째 원소만 출력 echo "a:b:c:d:e" | aw

[bash: awk] 현재 행에서 특정 문자열이 존재할 때 바로 이전 행을 출력하기

반달가면|2017년 2월 27일

텍스트 파일에서 특정 문자열을 검색해야 하는데, 해당 문자열이 출현했을 경우 바로 이전 행만 출력해야 할 경우에 awk를 이용해서 가능하다. 조건문을 사용해야 하므로 좀 복잡하긴 하지만, 어쨌든 가능. 개인적으로 이 문제에 대한 고민은 여러 행으로 이루어진 텍스트 파일에서 특정 부분을 따옴표(")로 묶어주어야 하는 문제 때문에 시작되었다. 어떤 형태의 문제였는지 예를 들자면 아래와 같다. john과 jane의 대화를 기록한 my_dialog.txt 파일의 내용이 아래와 같은 상황이다. # 파일 내용 확인 cat my_dialog.txt john: hello, jane. how are you? jane: not bad, john. thanks 위의 내용을 아래와 같이 바

[bash: awk] 일반 시간을 타임스탬프(timestamp)로 변환하기 (mktime)

반달가면|2017년 2월 3일

시간을 타임스탬프, 또는 유닉스 시간(unix time)으로 변환하고 싶을 경우 아래의 예시와 같이 date 명령으로 간편하게 바꿀 수 있다. (참고로, 유닉스 시간은 UTC 1970년 1월 1일 0시부터 몇초가 경과했는지를 나타낸다) # 2017년 1월 1일 9시 10분 25초를 유닉스 시간으로 (date) date -d "2017/1/1 09:10:25" "+%s" 1483229425 awk에서도 동일한 작업을 할 수 있다. # 2017년 1월 1일 9시 10분 25초를 유닉스 시간으로 (awk) echo "2017/1/1 09:10:25" | awk '{ date_arg=gensub("[/:]/," ","g",$0); print mktime(date_arg);}' 14832294

[bash: awk] awk에서 영역 구분을 이용한 문자열 재구성 작업 (gensub)

반달가면|2017년 1월 17일

예전에 sed에서 역슬래시-괄호를 이용한 영역 구분 및 문자열 재구성 작업 방법을 정리해 두었는데, 같은 종류의 작업을 awk에서도 할 수 있다. 문자열의 영역을 설정해서 자리를 바꾸거나 내용을 대체하거나 하는 등의 작업이다. 우선 awk에서 제공하는 gensub 함수를 보자. 통상적인 문자열 대체는 sub, gsub 함수를 사용할 수 있지만 영역을 설정하는 것은 gensub 함수를 이용해야 한다. (sub, gsub 함수에 대한 내용은 이전 게시물을 참고하자. 여기로) gensub 함수의 형식은 아래와 같다. gensub(/문자열 또는 정규표현식/, "대체할 문자열", 실행옵션, 대상) "대상" 문자열에서 "/문자열 또는 정규표현식/"을 찾아서 "대체할 문자열"로 바꾼다. 실행 옵션은