adsense_in_article_test


[bash: awk] 여러 종류의 단어 구분자를 지정해서 단어 선택하기 리눅스 bash script

한 문장에서 단어 구분자가 여러개인 경우에 단어를 하나씩 뽑아내는 방법니다. 예를 들어 "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 명령을 연결했다.



핑백

덧글

  • 2015/06/07 17:35 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 반달가면 2015/06/07 21:42 #

    제가 예전에 cygwin을 잠깐 썼던 기억을 더듬어 보자면, 리눅스 네이티브 환경이 아니기 때문에 성능이 썩 좋지 않았던 것 같습니다. 차라리 버추얼박스에 리눅스를 설치하거나 윈도우/리눅스 듀얼부팅이 더 나을 것입니다. CPU 성능을 최대한 뽑아내려면 듀얼부팅으로 가야 하고, 편리함과 유연성 측면을 생각하면 가상머신이 훨씬 편합니다. 그리고 VT-X라고 가상머신 가속 기능이 있기 때문에 가상환경도 아주 느리진 않을 겁니다.

    만약 저에게 비슷한 과제가 주어졌다면, 버추얼박스에 리눅스를 올리고 공유 폴더 기능을 이용해서 호스트에 저장된 텍스트 파일을 작업할 것 같습니다. bash 스크립트에서 대용량의 텍스트에 대해 반복작업을 해야 한다면 속도 문제 때문에 멀티 코어를 활용하기 위한 약간의 꼼수가 필요할 수도 있겠군요. 제가 써 놓은 function 관련 게시물을 참고하시기 바랍니다.

    http://bahndal.egloos.com/544643

    다른 궁금하신 점이 있다면 부담 없이 문의해 주셔도 됩니다. 꽤 의미 있은 작업을 하고 계신 듯하니 최대한 도와드리겠습니다 ^_^
  • 박미영 2015/06/07 17:39 # 삭제 답글

    ㅜㅜ 죄송한데,, 제가 조금전 덧글을 작성했는데 비공개로 해서 그런지 잘 올라간것인지 보려고 하는데 안보입니다. 올라간것이 맞는지요? ㅜㅜ 이런,,, ㅜㅜ
  • 반달가면 2015/06/07 21:45 #

    헛.. 답글을 달고 보니 비공개로 쓰셨군요. 글은 잘 올라왔습니다.
  • 박미영 2015/06/07 23:11 # 삭제 답글

    비공개로 하면 저도 안보이는줄 몰랐네요~ ㅎ
    다음학기때 관련 수업을 청강하게 될수도 있겠는데, 시그윈 설치를 한다고 하더라구요,,,
    저희가 하는 작업이 시그윈만으로도 충분하기 때문 아닐까요??
    선무당이 사람잡는다고 이것저것 지식인들의 답변들을 보니,,, 해도 되는건지,,뭘해야 하는건지,,,,,,
    꼼수에 관한 게시글은 아직 제 수준이 아닌것 같아서 나중에 보도록 하겠습니다 ㅎ

    지금은 일단 시그윈은 설치하고 파이썬도 설치,,하고,,,
    아니면 버추얼박스를 설치? 하고 리눅스를 올리는것부터,,, 공유 폴더 기능도 익히고,,, ㅜㅜ
    이런 저에게 어떤 작업이 더 손쉬울까요??

    주객이 전도되어 연구보다 연구방법 익히는데 시간이 더 걸린다면 ^^:;
    도와주신다는 말씀에 천군만마를 얻은 것 같이 힘이 됩니다만
    너무 기초적인 질문만 하게 될게 뻔한데 좀 죄송하기도,,, ^^:;;

    저같은 초보가 설치방법 블로그 같은 것을 보고 해결해야 하는데도
    시그윈보다는 버추얼박스 인가요?
    그런데 이 방법이 듀얼부팅이 아닌가요??
    암튼,,, 요...
  • 반달가면 2015/06/08 23:12 #

    제가 개인적으로 cygwin보다 버추얼박스를 좋아하다 보니 그런 쪽으로 답글을 단 것 같기도 하네요. 물론 가장 쉬운 방법은 cygwin입니다. 작업이 cygwin에서 제공하는 tool - 예를 들어 grep, sed, awk 등 리눅스에서 기본적으로 제공하는 기능 - 범위 안에 있다면 굳이 가상머신을 고려하지 않아도 됩니다.

    그러나 만약 리눅스에 있는 다양한 오픈소스 소프트웨어를 이것저것 설치해서 사용해야 되는 상황이라면 cygwin으로는 어렵고, 가상머신을 고려해야 할 것입니다.

    듀얼부팅은 디스크에 별도의 공간(파티션)을 마련해서 리눅스를 설치하는 방식입니다. 컴퓨터 전원을 켤 때 어느 OS로 시작할 것인지 선택합니다. 하드웨어 성능을 전부 뽑아내야 하는 상황에서 편의성을 희생하고 선택하는 방법이 되겠습니다.

    일단 cygwin을 사용해 보시고, 한계가 느껴진다면 그때 가상머신을 고려해도 늦지 않을 듯합니다.
  • 박미영 2015/06/09 23:09 # 삭제 답글


    자세하고도 합리적인 답변 감사합니다. ^^
    이제 덕분에 분석도구들의 용어에 익숙해 진듯하네요~
    시그윈을 깔았고, 이제 방학동안 파이썬과 R 통계와,,배시? 에 대해서 책보고 익힐려고 합니다~
    데이터 마이닝 기법의 하나인 텍스트 마이닝을 연구방법에 사용하려고 하거든요~
    본격적으로 실습? 하게 되면 모르는 것 질문 할께요 잘 가르쳐 주세요~ ^^;
    다시한번 답변에 시간내 주셔서 감사합니다~
  • 반달가면 2015/06/10 22:09 #

    리눅스/유닉스 shell의 텍스트 관련 기능이 상당히 강력하기 때문에 아마도 작업에 도움이 많이 될 듯합니다. 제가 전문가는 아니지만 그래도 없는 것보단 좀 낫겠지요 ㅎㅎ 하시는 연구 잘 되길 바랍니다~!!
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.



통계 위젯 (화이트)

16207
3300
2298694

2019 대표이글루_IT

B-Side