반달가면 이글루에서 백업 - http://bahndal.egloos.com/594934
awk에서 문자열 작업을 할 때, 한 행의 문자열을 분할해서 배열에 저장할 수 있다. 예를 들어 한 문장이 있을 때 단어별로 쪼개서 배열의 원소로 저장하는 경우다. awk에서 제공하는 split 함수를 이용하면 된다. split 함수의 형식은 아래와 같다.
split(문자열, 배열 이름, 구분자)
예를 들어 입력 받은 행($0)을 콜론(:) 기준으로 분할해서 배열 arr에 저장하고자 한다면 아래와 같이 된다.
split($0, arr, ":")
배열의 원소번호(index)는 1부터 시작한다. 위의 예시에서 첫번째 원소가 arr[1]에 있다. 아래의 예시를 보자.
# 문자열을 콜론을 기준으로 분할, 배열 arr에 저장한 후 세번째 원소만 출력
echo "a:b:c:d:e" | awk '{ split($0, arr, ":"); print arr[3] }'
c
예를 하나 더 생각해 보자. 대화 내용을 단어별로 분할해서 배열에 저장한 후 작업을 하는 경우다. 이 경우에는 단어 구분자가 공백뿐만 아니라 마침표(.), 물음표(?), 쉼표(,) 등 다양한 문장부호가 되어야 하므로 구분자 항목에 정규표현식을 사용해야 한다.
# 문장을 단어별로 분할해서 배열 arr에 저장한 후 세번째 단어만 출력
echo "Hello? Is anybody here?" | awk '{ split($0, arr, /[ .,?!]+/); print arr[3] }'
anybody
구분자에 사용된 정규표현식(/[ .,?!]+/)을 잠깐 보자면, 공백, 마침표, 쉼표, 물음표, 느낌표([ .,?!])가 하나 이상 연속해서 출현(+)하는 경우를 의미한다.
'bash script' 카테고리의 다른 글
[bash: timeout] 특정 명령어/프로세스에 대한 실행 시간 제한 설정 (0) | 2023.08.01 |
---|---|
[bash: basename] 디렉토리는 제외하고 파일명만 추출하기 (0) | 2023.08.01 |
[bash: awk] 현재 행에서 특정 문자열이 존재할 때 바로 이전 행을 출력하기 (0) | 2023.07.28 |
[bash: source] 스크립트에서 환경설정 파일 활용하기 (0) | 2023.07.28 |
[bash: sed] 특정한 문자열이 포함된 행 삭제하기 (0) | 2023.07.28 |