bash script2021. 4. 16. 13:36

 

반달가면 이글루에서 백업 - bahndal.egloos.com/510895

 

한 문장에서 단어 구분자가 여러개인 경우에 단어를 하나씩 뽑아내는 방법니다. 예를 들어 "Hello, my name is John. What's yours?" 이런 문장이 있는데 여기서 단어를 하나씩 가져오려면, 단어 구분자가 공백/쉼표/마침표/물음표 이렇게 여러가지가 되기 때문에 cut 명령으로는 어렵고 awk 명령을 써야 한다.

awk의 -F 옵션을 이용해서 구분자(field separator)를 지정할 때 정규표현(regular expression)을 사용하면 되겠다. 아래의 예시를 보자.

# 구분자는 공백/쉼표/마침표/물음표, 첫번째($1)와 세번째($3) 항목을 출력하되 항목 사이에 콜론을 출력
echo "Hello, my name is John. What's yours?" | awk -F '[ ,.?]' '{print $1 ":" $3}'
Hello:my

-F 옵션에서 구분자를 대괄호([])로 묶으면, 대괄호 안에 있는 캐럭터들이 모두 구분자로 인식된다. awk에 적용되는 명령문을 shell에서 해석하지 않도록 하기 위해 작은 따옴표(')를 사용하고 있음에 유의.

위의 예에서 Hello 다음에 구분자에 속하는 쉼표와 공백이 연속해서 나왔기 때문에, 첫번째 항목은 Hello, 두번째 항목은 아무것도 없고(null), 세번째 항목은 my가 될 것이다.

또 다른 예로, 위의 문장으로부터 쉼표나 마침표 등을 제외하고 단어만 골라서 출력을 해 보자. awk에서 for 명령을 이용한다.

# 유효한 단어만 골라내서 출력, 구분자는 공백/쉼표/마침표/물음표
echo "Hello, my name is John. What's yours?" | awk -F '[ ,.?]' '{ for (i=1;i<=NF;i++) print $i }' | grep [[:alnum:]]
Hello
my
name
is
John
What's
yours

for문을 이용해서 1부터 NF까지 하나씩 증가시키면서 i번째 항목을 출력한 것이다. NF 변수는 awk에서 항목의 수(the number of fields)를 뜻한다. 구분자가 연속해 있을 경우 빈 줄이 출력되므로, 빈 줄은 빼고 유효한 단어만 골라내기 위해 grep 명령을 연결했다.

 

728x90
Posted by 반달가면