Axil S/E-ljs063
                                1993.1.4
                               Lee Jin-Soo


SUBJECT:   Awk ¸í·É¾î »ç¿ë¹ý


o awk ¸í·É¾î
  awk¶ó´Â À̸§Àº À̸¦ °³¹ßÇÑ ¼¼ »ç¶÷ÀÇ À̸§ Aho, Weinberger, Kernighan¿¡¼­ À¯·¡µÈ °ÍÀÌ´Ù.
  awk¸í·É¾î´Â ÀÏ·ÃÀÇ ÀÔ·Â È­ÀÏÀ» Àоî ÁöÁ¤µÈ ÆÐÅÏ°ú ÀÏÄ¡ÇÏ´Â ÆÐÅÏÀ» °£Á÷ÇÑ ¶óÀÎÀ» ã´Â´Ù.
  ÆÐÅÏÀÌ ÀÏÄ¡Çϸé ÁöÁ¤µÈ ¿¬»êÀÌ ½ÇÇàµÈ´Ù. ¿©±â¼­ÀÇ ¿¬»êÀº ¶óÀÎ ³»ÀÇ Çʵå Á¶ÀÛÀ̳ª Çʵ尪À»
  ÀÌ¿ëÇÑ »ê¼ú ¿¬»êÀ» ÀǹÌÇÑ´Ù. ÀÌ awk´Â shell programming°ú bc ±×¸®°í C ÇÁ·Î±×·¡¹Ö¾ð¾îÀÇ ±â´ÉÀ» °®Ãá
  ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î bc¿Í °°ÀÌ ¿Ïº®ÇÏ°Ô Çص¶ÀÌ µÇ¸ç ½©ÀÇ ÀμöÀÎ $1, $2, $3°ú °°Àº À̸§À» °¡Áø
  ÇÊµå º¯¼ö°¡ °¢ ÀÔ·Â ¶óÀο¡ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¶Ç C ¾ð¾î¿Í À¯»çÇÑ ÇÁ¸°ÆÃ, Á¦¾î ¿¬»êÀÚµµ °¡Áö°í ÀÖ´Ù.
  awkÀÇ »ç¿ë¿¡´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ÇÑ°¡Áö ¹æ¹ýÀº ´ÙÀ½ Çü½ÄÀ¸·Î ŸÀÌÇÁÇÏ´Â °ÍÀÌ´Ù. 
     # awk program filename  --> program: ¸í·É¾îµé·Î ÀÌ·ç¾îÁü
                                 filename: awk°¡ ÀÛ¿ëÇÒ È­ÀÏÀÇ ¸íĪ
     # awk -f file filename  --> file: ÇÁ·Î±×·¥ ¸í·É¾îµéÀ» Æ÷ÇÔÇÏ°í ÀÖ´Â È­ÀÏÀÇ ¸íĪ
  ÇÁ·Î±×·¥Àº Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ÇÁ·Î±×·¥ ¶óÀεé·Î ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥ ¶óÀÎÀº ÀϹÝÀûÀ¸·Î
  ÆÐÅÏ°ú ÀÛ¿ëÀ¸·Î ÀÌ·ç¾îÁø´Ù. 
     /rotate/ {print}   --> ÆÐÅÏÀº rotate(´Ü¼øÇÑ ¹®ÀÚ¿­ ÆÐÅÏÀº /µé·Î µÑ·¯½ÎÀÓ) 
                            ÀÛ¿ëÀº printÀÌ´Ù.
  ÀÌ°ÍÀ» »ç¿ëÇϸé , awk ÇÁ·Î±×·¥Àº ¹®ÀÚ¿­ rotate¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀεéÀ» ¹ß°ßÇÏ°í ±×°ÍµéÀ» ÇÁ¸°Æ®ÇÑ´Ù.
  ±×°ÍÀº grep rotate filenameÀ» »ç¿ëÇÏ´Â °Í°ú °°´Ù.
  ÇʵåµéÀº °ø¹éµé¿¡ ÀÇÇØ ºÐ¸®µÈ ¹®ÀÚ¿­µéÀÌ´Ù.
  awk ÇÁ·Î±×·¥Àº Çʵ忡 ´ëÇÑ ·¹ÀÌºí ½Ã½ºÅÛÀ» °¡Áö°í ÀÖ´Ù. $1Àº ù ¹ø° ÇʵåÀÌ°í $2Àº µÎ ¹ø° ÇʵåÀÌ´Ù.
  $0Àº Ư¼öÇÑ Àǹ̸¦ °®´Â¹Ù, ±×°ÍÀº Àüü ¶óÀÎÀ» ³ªÅ¸³½´Ù.
    ---------------------------------------------------------------------------------------------
      ÆÐ  ÅÏ                    ÀÇ     ¹Ì 
    ---------------------------------------------------------------------------------------------
     /fish/              ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀÎ
     $1 - /fish/         ù¹ø° Çʵ尡 ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¶óÀÎ
     $3 - /fish/         ¼¼¹ø°   "                "
     $1! - /fish/        ù¹ø° Çʵ尡 ¹®ÀÚ¿­ fish¸¦ Æ÷ÇÔÇÏ°í ÀÖÁö ¾ÊÀº ¶óÀÎ
    ---------------------------------------------------------------------------------------------
       
    ---------------------------------------------------------------------------------------------
      ÀÛ  ¿ë                     ÀÇ    ¹Ì  
    ---------------------------------------------------------------------------------------------
     {print $2}          µÎ¹ø° Çʵ常À» ÇÁ¸°Æ®Ç϶ó
     {print $4,$2}       ³×¹ø° ÇʵåÀÇ ³»¿ëÀ» ÇÁ¸°Æ®ÇÑ ´ÙÀ½ µÎ¹ø° ÇʵåÀÇ ³»¿ëÀ» ÇÁ¸°Æ®Ç϶ó
     {print $2,$2+$4}    µÎ¹ø° Çʵ带 ÇÁ¸°Æ®ÇÑ ´ÙÀ½ µÎ¹ø° Çʵå¿Í ³×¹ø° ÇʵåÀÇ ÇÕÀ» ÇÁ¸°Æ®Ç϶ó 
     {s=$2+$4; print s}  µÎ¹ø°¿Í ³×¹ø° Çʵ带 Ãß°¡ÇÑ ´ÙÀ½, ±× ÇÕÀ» ÇÁ¸°Æ®Ç϶ó
    ---------------------------------------------------------------------------------------------
  ÆÐÅÏ¿¡¼­ÀÇ ~¿Í !»ç¿ë¿¡ ÁÖ¸ñÇ϶ó. ~´Â ¿ìÃø¿¡ ÀÖ´Â ÆÐÅÏÀÌ ÁÂÃø¿¡ ÀÖ´Â Çʵ忡 Æ÷ÇԵȴٴ °ÍÀ» ÀǹÌÇÑ´Ù.
  !~ Á¶ÇÕÀº ¿ìÃøÀÇ ÆÐÅÏÀÌ ÁÂÃøÀÇ Çʵ忡 Æ÷ÇÔµÇÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù. 
  { }ÀÛ¿ëµéÀ» ¼¼¹ÌÄÝ·ÐÀ¸·Î ºÐ¸®½ÃÅ´À¸·Î½á Çϳª ÀÌ»óÀÇ ÀÛ¿ëµéÀ» Æ÷ÇÔ½ÃÅ´ ¼ö ÀÖ´Ù.

  ¸î°¡Áö ÀÌ·¯ÇÑ °³³äµéÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹¸¦ °íÂûÇغ¸ÀÚ. È­ÀÏ sales´Â ¿©¼¸ ¿­ÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
  ù¹ø° ¿­Àº Ç°¸ñ ¸íĪ, µÎ¹ø° ¿­Àº Ç°¸ñÀÇ ÆǸŰ¡°Ý , ±×¸®°í ´ÙÀ½ÀÇ ³× ¿­µéÀº Ç°¸ñ¿¡ ´ëÇÑ ºÐ±âº°
  ÆǸżöÀÌ´Ù.
      # vi sales
         carts     29.99  45  13  55  22
         corks      0.02  30  20  25  93
         doors     49.99  40  15  20  25
         geese     15.00   2   8   1 128
         nighties  50.00  11  23  15  82 
  ¿ì¸®´Â µÎ ¿­À» Ãß°¡ÇÏ·Á ÇÑ´Ù. Ç°¸ñÇÕ°è ±×¸®°í Çö±Ý ÆǸŠÇÕ°è. 
  ´ÙÀ½°ú °°Àº addupÀ̶ó´Â È­ÀÏÀ» ÀÛ¼ºÇÑ´Ù.
      # vi addup
        {total=$3+$4+$5+$6;print $0, total, total*$2} 
  ÀÌ ÀÛ¿ëÀº ;¿¡ ÀÇÇØ ºÐ¸®µÈ µÎ ºÎºÐµéÀ» °¡Áö°í ÀÖ´Ù. ù ºÎºÐÀº ÆǸżö¸¦ ÇÕÇÏ°í ¿µ¸®ÇÏ°Ôµµ Çհ踦
  totalÀ̶ó ºÎ¸¥´Ù. µÎ¹ø° ºÎºÐÀº ¿ø·¡ÀÇ ¶óÀÎ($0)À» ÇÁ¸°Æ®ÇÏ°í, ±× µÚ¿¡ Çհ踦 , ±× ´ÙÀ½¿¡´Â 
  total*$2¸¦ ÇÁ¸°Æ®Çϴµ¥, ÀÌ°ÍÀº ÇÕ°èxµÎ¹ø° ¿­À» ÀǹÌÇÑ´Ù.
      # awk -f addup sales
         carts     29.99  45  13  55  22  135  4040.64
         corks      0.02  30  20  25  93   93  3.36 
         doors     49.99  40  15  20  25  100  4999
         geese     15.00   2   8   1 128  139  2085
         nighties  50.00  11  23  15  82  131  6550


o awk ÀÔ·Â ¶óÀÎÀ» Àд ¹æ¹ý
  Ç¥ÁØ ÀÔ·ÂÀ̳ª È­ÀϷκÎÅÍ ÀÐÇôÁö´Â °¢ ¶óÀÎÀº °ø¹é¹®ÀÚ·Î ±¸ºÐµÈ Çʵ带 °¡Áö°í ÀÖ´Â °ÍÀ¸·Î °£ÁֵȴÙ.
  -F(field)¼±ÅÃÀÚ µÚ¿¡ ÀÓÀÇÀÇ ¹®ÀÚ¸¦ ÀÔ·ÂÇϸé ÇÊµå ±¸ºÐÀÚ°¡ ±× ¹®ÀÚ·Î º¯°æµÈ´Ù.
  ¿¹¸¦ µé¾î :(ÄÝ·Ð)À» ±¸ºÐÀÚ·Î »ç¿ëÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.
     # awk -F: -f prog files
  
o awkÀÇ ÆÐÅÏ°ú ¿¬»ê
  awk°¡ ÀоîµéÀÌ´Â ¶óÀΰú Çʵåµé¿¡ ´ëÇÑ ÀÛ¾÷Àº ÆÐÅÏ-¿¬»êÀÇ ½ÖÀ¸·Î Á¤ÀǵǸç À̽ÖÀº ´ÙÀ½°ú °°Àº
  Çü½ÄÀ» °®´Â´Ù.
      pattern {action}
  ¿¬»ê ºÎºÐÀ» Áß°ýÈ£·Î µÑ·¯½ÓÀ¸·Î½á ÆÐÅÏ°ú ±¸ºÐÇÑ´Ù. ¿¬»ê ºÎºÐÀÌ »ý·«µÇ¸é ±× ¶óÀÎÀÌ ÇÁ¸°Æ®µÈ´Ù.
  ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ¿¬»ê¿¡´Â print°¡ ÀÖÀ¸¸ç ÀÌ ¿¬»êÀº Àμö¸¦ Ç¥ÁØ Ãâ·Â¿¡ Ãâ·ÂÇÑ´Ù.
  ´ÙÀ½¿¬»êÀº ÀÔ·Â ÇÊµå °³ÀÇ ¼ø¼­¸¦ ¹Ù²Ù¾î Ãâ·ÂÇÑ´Ù.
      { print $2, $1}
     # vi in.file
       hello goodbye again
       111 222
       thirty forty
     # vi awk.prog1
       {print $2, $1}
     # awk -f awk.prog1 in.file
       goodbye hello
       222 111
       forty thirty
   À§ÀÇ ¿¹¿¡¼­ printÀÇ Àμö´Â ÄÞ¸¶·Î ±¸ºÐµÇ¾úÀ¸¸ç ÀÌ·Î ÀÎÇØ Ãâ·Â µ¥ÀÌÅÍ »çÀÌ¿¡ ÇöÀçÀÇ ÇÊµå ±¸ºÐÀÚ°¡
   »ðÀԵǾú´Ù. ÄÞ¸¶°¡ »ý·«µÇ¸é $1°ú $2°¡ ¿¬¼ÓÇÏ¿© Ãâ·ÂµÈ´Ù.
   ¿¹¸¦ µé¾î ´ÙÀ½ÀÇ awk ÇÁ·Î±×·¥Àº
     # vi awk.prog2
       /hello/ {print $2, $1}
     # awk -f awk.prog2 in.file  --> ÀÔ·Â È­ÀÏ ³»¿¡¼­ ÆÐÅÏ /hello/°ú ÀÏÄ¡ÇÏ´Â ¶óÀÎÀº 1°³»ÓÀ̱â 
        goodbye hello                 ¶§¹®¿¡ ±× ¶óÀο¡ ´ëÇؼ­¸¸ ÁöÁ¤µÈ ¿¬»êÀÎ print°¡ ½ÇÇàµÇ¾ú´Ù.
     # vi awk.prog3
       /hello/ {print $2, $1}
       /thirty/ {print $1, $2, "and more"}
     # awk -f awk.prog3 in.file  --> print¸í·É¾îÀÇ Àμö°¡ µû¿ÈÇ¥·Î µÑ·¯½Î¿© Á¦°øµÇ¾úÀ¸¸ç ±× ¹®ÀÚ¿­ÀÌ
        goodbye hello                 Ãâ·Â¿¡ Ç¥½ÃµÇ¾ú´Ù.
        thirty forty and more
     # vi awk.prog4
       /hello/||/111/ {print "htt", $1, $2}
     # awk -f awk.prog4 in.file  --> ||¿¬»êÀÚ´Â 2°³ÀÇ Á¤±Ô½Ä Áß Çϳª¸¸ ÀÏÄ¡Çϸé ÁöÁ¤µÈ ¿¬»êÀ» ½ÇÇàÇϸç 
        hit hello goodbye            &&¿¬»êÀÚ´Â 2°³ÀÇ Á¤±Ô½ÄÀÌ ¸ðµÎ ÀÏÄ¡¾ÖÇá ÁöÁ¤ ¿¬»êÀ» ½ÇÇàÇÑ´Ù.
        hit 111 222                  !¿¬»êÀÚ´Â Á¤±Ô½ÄÀÌ ÀÏÄ¡ÇÏÁö ¾Ê¾Æ¾ß ÁöÁ¤µÈ ¿¬»êÀ» ½ÇÇàÇϸç 
                                     Á¤±Ô½Ä ¾Õ¿¡ ±â¼úµÈ´Ù.
     # vi awk.prog5
       /^[Hh1]/ {print "htt", $0}
     # awk -f awk.prog5 in.file  --> $0À» »ç¿ëÇ߱⠶§¹®¿¡ ÀÔ·Â ¶óÀÎ Àüü°¡ Ãâ·ÂµÇ¾úÀ½
        hit hello goodbye again      Hh1À¸·Î ½ÃÀÛÇÏ´Â lineÀ» Ãâ·Â
        hit 111 222 
     # vi awk.prog6
       /hello/ {
                print $2
                print "another"
                print $1
       }
     # awk -f awk.prog6 in.file  --> ÆÐÅÏ /hello/¿Í ÀÏÄ¡Çϴ ù¹ø° ÀÔ·Â ¶óÀθ¸ÀÌ ¿¬»êÀÇ ´ë»óÀÌ µÊ
        goodbye
        another
        hello 
     
o awk¸¦ ÀÌ¿ëÇÑ ¼ýÀÚ ¿¬»ê
  awkÀÇ »ê¼ú ¿¬»êÀÌ bcÀÇ »ê¼ú ¿¬»ê°ú ´Ù¸¥ Á¡Àº awk´Â ÀÔ·Â È­ÀÏ ³»ÀÇ ¶óÀÎ Áß ÀϺθ¦ ¼±ÅÃÇÏ´Â 
  ÆÐÅÏ ºÎºÐÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
  ¿¹¸¦ µé¾î awkÀÇ ³»Àå ÇÔ¼öÀÎ length´Â ¹®ÀÚ¿­·Î Ãë±ÞµÇ´Â ÀÔ·Â ÇʵåÀÇ ±æÀ̸¦ ¹ôȯÇÏ¸ç ¼ýÀÚ º¯¼ö´Â
  ¼ýÀÚ·Î Ãë±ÞµÇ´Â ÇʵåÀÇ °ªÀ» ÇÒ´ç¹ÞÀ» ¼ö ÀÖ´Ù. 
     # vi awk.prog7
       {
             s += $2
             print $2, "length=" length($2), "s=" s
       }
     # awk -f awk.prog7 in.file  --> ¼ýÀÚ·Î º¯È¯µÉ¼ö ¾ø´Â ¹®ÀÚ¿­Àº °ªÀÌ 0ÀÌ µÈ´Ù. 
        goodbye length=7 s=0         ¹®ÀÚ¿­ thirty°¡ ±× ¿¹·Î¼­, ¼ýÀÚ·Î º¯È¯µÉ¼ö ¾ø´Ù. ±×·¯³ª ¹®ÀÚ¿­
        222 length=3 s=222           222´Â ¼ýÀÚ·Î ¿Ã¹Ù¸£°Ô º¯È¯µÇ¾ú´Ù. ¶ÇÇÑ s=0°ú °°Àº Çü½ÄÀ¸·Î º¯¼ö¿¡
        forth length=5 s=222         °ªÀ» ÇÒ´çÇÒ ¼ö ÀÖ´Ù.
  ´ÙÀ½Àº awkº¯¼öÀÇ ¿ç¹Ù¸¥ ¿¹ÀÌ´Ù.
   s
   S
   SS
   S1
   qwerty[42]
  º¯¼ö¸¦ »ç¿ëÇϱâ Àü¿¡ ¼±¾ðÇϰųª ÃʱâÈ­½Ãų ÇÊ¿ä´Â ¾ø´Ù. awk°¡ ÀÚüÀûÀ¸·Î º¯¼ö¸¦ ÃʱâÈ­½ÃÅ°¸ç
  ÇÊ¿ä¿¡ µû¶ó ±× º¯¼ö¸¦ ¹®ÀÚ¿­À̳ª ¼ýÀÚ¸¦ ±â¾ï½Ãų¼ö ÀÖ´Ù. 
      # vi awk.prog8
        /hello/ {
                SSS=34
                print "SSS is", SSS
                SSS=hello
                print "SSS is", SSS 
        }
      # awk -f awk.prog8 in.file  --> ÀÌ¿Í °°Àº ÀÚµ¿ÀûÀÎ º¯¼ö Çü½Ä º¯È¯Àº º¯¼öÀÇ »ç¿ëÀ» ¼ö¿ùÇÏ°Ô ÇÑ´Ù.
         SSS is 34
         SSS is hello

o 󸮸¦ ½ÃÀÛÇÏ°í ³¡³»±â À§ÇÑ Æ¯¼ö ÆÐÅÏ
  Á¤±Ô½Ä ÆÐÅÏ ¿Ü¿¡µµ 2°³ÀÇ Æ¯¼ö ÆÐÅÏÀ¸·Î BEGIN°ú END°¡ »ç¿ëµÈ´Ù. BEGINÀº ù ¹ø° ÀÔ·Â ¶óÀÎÀ» 
  Àбâ Àü¿¡ awkÇÁ·Î±×·¥ÀÇ ¼±µÎ¿¡¼­ ½ÇÇàµÇ¸ç END´Â ¸¶Áö¸· ÀÔ·Â ¶óÀÎÀÌ Ã³¸®µÈ ÈÄ ÇÁ·Î±×·¥ÀÇ Á¦ÀÏ
  ³¡¿¡¼­ ½ÇÇàµÈ´Ù.
  BEGINÀº ÁÖ·Î º¯¼ö ÃʱâÈ­ µîÀÇ ÀÛ¾÷¿¡ »ç¿ëµÇ¸ç END´Â ¸¶Áö¸· °è»êÀ» ÇÏ°í Ãâ·ÂÀ» ¿ä¾àÇÏ´Â ÀÛ¾÷¿¡
  »ç¿ëµÈ´Ù. BEGINÀ̳ª END°¡ ¾ø¾îµµ µÇ³ª ÇÊ¿äÇÑ °æ¿ì Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù. 
  ¿¹¸¦ µé¾î ´ÙÀ½ ÇÁ·Î±×·¥Àº ¿©·¯ °³ ¼ýÀÚÀÇ Æò±Õ°ªÀ» Ãâ·ÂÇÑ´Ù. 
       BEGIN {
                print "Beginning to process the input data ..."
              }
             {
                s += $1
                n++
              }
       END   {
                print "mean of these",n,"data items is", s/n
              } 
  ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®ÇÏ´Â BEGIN°ú °ü·ÃµÈ ¿¬»êÀº ÇÁ·Î±×·¥ÀÇ ¼±µÎ¿¡¼­ ½ÇÇàµÇ¸ç ±× ÈÄ¿¡ °¢ ÀԷ¶óÀÎÀÌ
  ÀÐÇôÁø´Ù. ÆÐÅÏÀÌ »ý·«µÇ¾ú±â ¶§¹®¿¡ ¸ðµç ÀÔ·Â ¶óÀο¡ ´ëÇØ ¿¬»êÀÌ ½ÇÇàµÇ¾ú´Ù. 
  ù ¹ø° Çʵ带 º¯¼ö s¿¡ ´õÇÏ°í 1À» Áõ°¡½ÃÅ°¸ç ¸¶Áö¸·ÀÇ ENDÆÐÅÏÀº ¸ðµç ÀÔ·ÂÀÌ Ã³¸®µÈ ÈÄ ½ÇÇàµÈ´Ù.
  ÀÌ END ÆÐÅÏ¿¡¼­´Â °è»êÀÇ ÃÖÁ¾ °á°ú¸¦ Ãâ·ÂÇÏ°í ÀÖ´Ù.