UNIX/유닉스 공통

[스크랩] AWK 명령 자세히

99iberty 2014. 5. 22. 16:53

http://comefeel.tistory.com/entry/AWK%EC%9D%98-%EC%9E%90%EC%84%B8%ED%95%9C-%EC%82%AC%EC%9A%A9%EB%B2%95

 

awk 명령

목적

파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행합니다.

구문

awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...

설명

awk 명령은 사용자 정의 명령어 집합을 활용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교합니다. 그런 다음, 확장 정규식과 일치하는 모든 행에 조치를 실행합니다.

awk 명령의 패턴 탐색은 grep 명령의 패턴 탐색보다 더 일반적이고, 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있게 합니다. awk 명령 프로그래밍 언어는 컴파일을 필요로 하지 않고, 변수, 수치 함수, 문자열 함수 및 논리 연산자를 사용하는 것을 허용합니다.

다음 주제들이 본 절에 설명되어 있습니다.

awk 명령에 대한 입력

awk 명령은 두 종류의 입력, 입력 텍스트 파일과 프로그램 명령어를 받아들입니다.

입력 텍스트 파일

탐색과 조치는 입력 텍스트 파일상에서 실행됩니다. 입력 텍스트 파일은 다음 방식으로 지정됩니다.

  • 명령 행에서 File 변수를 지정.
  • 특수 변수인 ARGVARGC을 변경.
  • File 변수가 없을 경우 표준 입력을 제공.

File 변수를 사용하여 여러 파일을 지정하면, 파일은 지정된 순서에 따라 처리됩니다.

프로그램 명령어

사용자가 제공하는 명령은 awk 명령의 조치를 제어합니다. 이 명령어는 명령 행에서 `Program' 변수를 사용해 입력하거나, ProgramFile 변수와 -f 플래그에 의해 지정된 파일을 사용해 입력할 수 있습니다. 여러 프로그램 파일이 지정되면, 파일은 지정된 순서에 따라 병합되고 그 결과로 생성되는 명령어의 순서가 사용됩니다.

awk 명령의 출력

awk 명령은 입력 텍스트 파일에 있는 데이타로부터 세 가지 종류의 결과를 출력합니다.

  • 선택된 데이타는 입력 파일에 대한 변경 없이 표준 출력에 인쇄될 수 있습니다.
  • 입력 파일 중 선택된 부분을 변경할 수 있습니다.
  • 선택된 데이타는 입력 파일 내용의 변경 여부와는 상관없이 변경되고 표준 출력에 인쇄됩니다.

세 종류의 출력 모두 같은 파일에서 수행될 수 있습니다. awk 명령이 인식하는 프로그래밍 언어를 사용하면, 사용자는 출력 방향을 전환할 수 있습니다.

레코드와 필드를 갖는 파일의 처리

파일은 다음과 같은 방법으로 처리됩니다.

  1. awk명령은 입력 파일을 읽기 전에 파일에 있는 명령어를 검색하여, 지정된 조치를 실행합니다.

    사용자는 awk 프로그래밍 언어의 BEGIN문을 사용하여, 첫번째 레코드를 읽기 전에 실행해야 할 명령어 집합을 지정할 수 있습니다. 이 방법은 특수 변수를 초기화하는 데 특히 유용합니다.

  2. 입력 파일로부터 하나의 레코드가 읽혀집니다.

    레코드는 레코드 분리자로 서로가 구분된 데이타의 집합입니다. 디폴트 레코드 분리자는 개행 문자입니다. 개행 문자는 파일의 각 행을 별개의 레코드로 만듭니다. 레코드 분리자는 RS 특수 변수를 설정하여 변경할 수 있습니다.

  3. 레코드는 awk 명령의 명령어가 지정하는 각 패턴과 비교됩니다.

    awk 명령의 명령어는 레코드 내의 특정 필드만이 비교되도록 지정할 수 있습니다. 디폴트로, 필드는 공백 문자(공백 또는 탭)에 의해 구분됩니다. 각 필드는 필드 변수에 의해 참조됩니다. 레코드의 첫번째 필드에는 $1 변수가 할당되고, 두 번째 필드에는 $2 변수가 할당되고, 나머지 필드도 마찬가지로 변수가 할당됩니다. 레코드 전체에는 $0 변수가 할당됩니다. 명령 행에서 -F 플래그를 사용하거나, FS 특수 변수를 설정함으로써 필드 분리자를 변경할 수 있습니다. FS 특별 변수의 값은 공백, 단일 문자 또는 확장 정규식 중 하나이어야 합니다.

  4. 레코드가 패턴과 일치하면, 패턴과 관련된 조치를 레코드에 실행합니다.
  5. 레코드가 각 패턴과 비교되고, 지정된 모든 조치가 수행된 후 입력으로 부터 다음 레코드를 읽습니다. 입력 파일에서 모든 레코드를 읽을 때까지 이 과정을 반복합니다.
  6. 지정된 입력 파일이 하나가 아니면, 다음 파일을 읽고 위의 과정을 반복합니다. 모든 파일을 읽을 때까지 이 과정을 반복합니다.
  7. 마지막 파일의 마지막 레코드를 읽고 나면, awk 명령은 입력 처리 후에 실행하도록 지정된 모든 명령을 실행합니다.

    사용자는 awk 프로그래밍 언어의 END문을 사용하여 마지막 레코드를 읽은 후 수행해야할 조치를 지정할 수 있습니다. 이 방법은 awk 명령이 완료한 작업에 대한 메세지를 전송하는 데 특히 유용합니다.

awk 명령 프로그래밍 언어

awk 명령 프로그래밍 언어는 다음과 같은 형태의 문으로 구성됩니다.

Pattern { Action }

레코드가 지정된 패턴과 일치하거나 패턴과 일치하는 필드를 가지고 있으면, 관련된 조치가 실행됩니다. 조치를 가지고 있지 않은 패턴을 지정할 수도 있습니다. 이 경우 패턴을 포함하고 있는 전체 행이 표준 출력 장치에 출력됩니다. 패턴이 없이 지정된 조치는 모든 입력 레코드에 실행됩니다.

패턴

awk 명령 언어 구문에는 네 가지 종류의 패턴이 사용됩니다.

정규식

awk 명령이 사용하는 확장 정규식은 grep 또는 egrep 명령이 사용하는 것과 유사합니다. 가장 간단한 형태의 확장 정규식은 슬래시 기호로 둘러싸인 문자열입니다. 예를 들어, testfile이라는 이름의 파일에 다음 내용이 있다고 가정합니다.

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

다음 명령 행을 입력합니다.

awk '/smi/' testfile

위의 명령은 smi 문자열을 포함하고 있는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제에서, awk 명령의 '/smi/' 프로그램은 조치를 가지고 있지 않는 패턴입니다. 출력 결과는 다음과 같습니다.

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

다음의 특수 문자는 확장 정규식을 만들기 위해 사용됩니다.

문자 기능
+ +(더하기 기호) 앞에 있는 문자나 확장 정규식이 문자열에 한 번 또는 그 이상 나타나면, 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/smith+ern/' testfile

위의 명령은 smit가 있고, 그 뒤에 h 가 한 번 또는 한 번 이상 나타나고, 그리고 ern으로 끝나는 문자열을 포함하고 있는 모든 레코드를 표준 출력에 기록합니다. 이 예제의 출력은 다음과 같습니다.

smithern, harry
smithhern, anne
? ?(물음표) 앞에 있는 문자나 확장 정규식이 문자열에 없거나 또는 한 번 나타나면 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/smith?/' testfile

위의 명령은 smit가 있고, 그 뒤에 h가 없거나 또는 한 번 나타나는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제의 출력은 다음과 같습니다.

smith, alan
smithern, harry
smithhern, anne
smitters, alexis
| |(파이프)로 구분된 두 문자열 중 하나가 레코드의 문자열에 포함되어 있으면, 레코드의 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/allen 
| 
alan /' testfile

위의 예는 문자열 allen 또는 alan을 포함하고 있는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제의 출력은 다음과 같습니다.

smiley, allen
smith, alan
( ) 확장 정규식 안에서 문자열을 묶습니다. 예를 들면 다음과 같습니다.
awk '/a(ll)?(nn)?e/' testfile

위의 예는 문자열 ae 또는 alle 또는 anne 또는 allnne를 포함하고 있는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제의 출력은 다음과 같습니다.

smiley, allen
smithhern, anne
{m} 패턴이 문자열에 정확히 m번 나타나야만 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/l{2}/' testfile

위 명령은 다음을 표준 출력 장치에 출력합니다.

smiley, allen
{m,} 패턴이 문자열에 최소한 m번 나타나야 문자열이 일치한다는 것을 지정합니다. 예를 들면 다음과 같습니다.
awk '/t{2,}/' testfile

위 명령은 다음을 표준 출력에 기록합니다.

smitters, alexis
{m, n} 패턴이 문자열에 m 번과 n번 사이로 나타나면, 문자열이 일치한다는 것을 지정합니다(여기서, m <= n). 예를 들면 다음과 같습니다.
awk '/er{1, 2}/' testfile

위의 명령은 다음을 표준 출력에 기록합니다.

smithern, harry
smithern, anne
smitters, alexis
[String] 정규식이 대괄호 안에 있는 String 변수가 지정한 어느 문자와도 일치한다는 것을 강조합니다. 예를 들면 다음과 같습니다.
awk '/sm[a-h]/' testfile

sm이 있고 그 뒤에 ah 사이의 문자라면 어떤 문자든지 가지고 있는 모든 레코드를 표준 출력에 기록합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
[^ String] [ ](대괄호)안의 지정된 문자열의 선두에 있는 ^(삽입 기호)는 정규식이 대괄호 안에 있는 어느 문자와도 일치하지 않는다는 것을 나타냅니다. 예를 들면 다음과 같습니다.
awk '/sm[^a-h]/' testfile

위의 명령은 다음을 표준 출력에 기록합니다.

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
~,!~ 지정된 변수가 정규식과 일치(~) 또는 불일치(!~)한다는 조건문을 나타냅니다. 예를 들면 다음과 같습니다.
awk '$1 ~ /n/' testfile

첫번째 필드가 문자 n을 포함하고 있는 모든 레코드를 표준 출력에 기록합니다. 이 예제의 출력은 다음과 같습니다.

smithern, harry
smithhern, anne
^ 필드나 레코드의 시작을 나타냅니다. 예를 들면 다음과 같습니다.
awk '$2 ~ /^h/' testfile

두 번째 필드의 최초 문자가 h인 모든 레코드를 표준 출력에 기록합니다. 이 예제의 출력은 다음과 같습니다.

smithern, harry
$ 필드나 레코드의 끝을 나타냅니다. 예를 들면 다음과 같습니다.
awk '$2 ~ /y$/' testfile

두 번째 필드의 최종 문자가 y인 모든 레코드를 표준 출력에 기록합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
smithern, harry
. (period) 공백 끝에 있는 터미널 캐리지 리턴 문자를 제외한 모든 단일 문자를 나타냅니다. 예를 들면 다음과 같습니다.
awk '/a..e/' testfile

두 개의 문자로 구분되는 a와 e 사이의 문자가 있는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
smiley, allen
smithhern, anne
*(asterisk) 문자가 하나 또는 그 이상임을 나타냅니다. 예를 들면 다음과 같습니다.
awk '/a.*e/' testfile

0개 이상의 문자로 구분되는 a와 e 사이의 문자가 있는 모든 레코드를 표준 출력 장치에 출력합니다. 이 예제의 출력은 다음과 같습니다.

smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\ (backslash) 이스케이프 문자. 이스케이프 문자가 확장 표현식 내에서 특별한 의미를 가지고 있는 문자 앞에 있으면, 문자로부터 특별한 의미를 제거합니다. 예를 들면 다음과 같습니다.
/a\/\//

a// 패턴과 일치합니다. 왜냐하면, 역슬래시가 슬래시가 정규 표현식의 분리문자라는 통상적인 의미를 부정하기 때문입니다. 역슬래시 그 자체를 문자로 지정하려면, 이중 역슬래시를 사용해야 합니다. 역슬래시와 그 사용에 대한 자세한 정보는 이스케이프 문자열에 관한 다음 항목을 참조하십시오.

인식되는 이스케이프 문자열

awk 명령은 awk 명령에 의해 특별한 문자로 사용되는 이스케이프 문자열뿐 아니라 C 언어에서 통례적으로 사용되는 대부분의 이스케이프 문자열를 인식합니다. 이스케이프 문자열은 다음과 같습니다.

이스케이프 문자열 의미하는 문자
\" \"(큰따옴표) 기호
\/ /(슬래시) 문자
\ddd 코드화할 때 하나, 둘 또는 세 자리의 8진 정수로 표현되는 문자. d는 8진 자릿수를 나타냅니다.
\\ \(역슬래시) 문자
\a 경보 문자
\b 백스페이스 문자
\f 폼피드(form feed) 문자
\n 개행 문자(다음의 주를 참조)
\r 캐리지 리턴(carriage return) 문자
\t 탭 문자
\v 수직 탭

주: gsub, match, splitsub 내장 함수를 제외하고, 확장 정규식의 일치는 입력 레코드에 근거합니다. 레코드 분리자 문자(디폴트로 개행 문자)는 표현식에 삽입될 수 없으며, 어떠한 표현식도 레코드 분리자 문자와 일치하지 않습니다. 레코드 분리자가 개행 문자가 아닌 경우, 개행 문자는 일치될 수 없습니다. 지정된 내장 함수에서의 일치는 텍스트 문자열에 근거하며, (레코드 분리자를 포함하는) 모든 문자를 패턴에 삽입하여 패턴이 해당 문자와 일치하도록 할 수 있습니다. 그러나, awk 명령이 있는 정규 표현식 일치에서, 패턴에서의 하나 이상의 NULL 문자의 사용은 정의되지 않은 결과를 생성합니다.

관계식

관계형 연산자 <(보다 작다), > (보다 크다), <=(작거나 같다), >=(크거나 같다), = =(같다) 그리고 ! =(같지 않다)는 패턴을 만드는 데 사용됩니다. 예를 들면 다음과 같습니다.

$1 < $4

위의 패턴은 첫번째 필드가 네 번째 필드보다 작은 레코드와 일치합니다. 관계 연산자에 문자열 값도 사용할 수 있습니다. 예를 들면, 다음과 같습니다.

$1 =! "q"

위의 패턴은 첫번째 필드가 q가 아닌 레코드와 일치합니다. 문자열 값은 배열(collating) 값에 일치될 수 있습니다. 예를 들면, 다음과 같습니다.

$1 >= "d"

위의 패턴은 첫번째 필드가 a, b, c 또는 d로 시작하는 모든 레코드와 일치합니다. 추가적인 정보가 없으면, 필드 변수는 문자열 값으로서 비교됩니다.

패턴 조합

세 가지 옵션을 사용해 패턴을 조합할 수 있습니다.

  • 범위는 ,(쉼표)에 의해 구분된 두 패턴에 의해 지정됩니다. 첫번째 패턴과 일치하는 레코드로 시작하여 두 번째 패턴과 일치하는 레코드 사이의 모든 레코드(두 번째 패턴과 일치하는 레코드도 포함)에 조치가 실행됩니다. 예를 들면, 다음과 같습니다.
    /begin/,/end/
    위 패턴은 begin을 포함하는 레코드, 그 레코드와 end를 포함하는 레코드 사이에 있는 모든 레코드 및 end를 포함하는 레코드와 일치합니다.
  • 괄호( )는 패턴을 묶습니다.
  • 부울 연산자 ||(또는), &&(and) 및 !(NOT)은 패턴을 결합해 결합된 그 값이 참이면 일치하고 참이 아니면 불일치하는 표현식을 생성합니다. 예를 들면 다음과 같습니다.
    $1 == "al" && $2 == "123"
    위 패턴은 첫번째 필드가 al이고 두 번째 필드가 123인 레코드와 일치합니다.

BEGIN과 END 패턴

BEGIN 패턴으로 지정된 조치는 모든 입력을 읽기 전에 수행됩니다. END 패턴으로 지정된 조치는 모든 입력을 읽은 다음 수행됩니다. 여러 개 BEGINEND 패턴은 지정된 순서로 허용되고 처리됩니다. END 패턴은 프로그램 명령문 내에서 BEGIN 패턴을 선행할 수 있습니다. 프로그램이 BEGIN 명령문만으로 구성된 경우, 조치가 수행되며 어떠한 입력도 읽지 않습니다. 프로그램이 END 명령문만으로 구성된 경우, 모든 입력은 조치를 취하기 전에 읽습니다.

조치

여러 종류의 조치문이 존재합니다.

조치문

조치문은 { }(중괄호)로 둘러 쌉니다. 패턴 없이 문이 지정되면, 조치는 모든 레코드에 실행됩니다. 괄호 안에 다중 조치를 지정할 수 있습니다. 그러나 각 조치들은 개행 문자 또는 ;(세미콜론)으로 구분되어야 하고, 조치문은 나타나는 순서대로 처리됩니다. 조치문은 다음을 포함하고 있습니다.

산술문
산술 연산자 +(더하기 부호), -(빼기 부호), /(나눗셈), ^(지수화), *(곱셈), %(모듈러스)는 다음 형태로 사용됩니다.
expression! Operator expression!

예를 들면 다음과 같습니다.

$2 = $1 ^ 3

위 산술문은 첫번째 필드의 세제곱을 두 번째 필드에 지정합니다.

1진법 문
1진법 -(빼기 부호)와 1진법 +(더하기 부호)는 C 프로그래밍 언어에서와 같이 작동합니다.
+expression! or -expression!
증감문
사전 중분 및 사전 감소문은 C 프로그래밍 언어에서와 같이 작동합니다.
++Variable or --Variable

사후 증분 및 사후 감소문은 C 프로그래밍 언어에서와 같이 작동합니다.

Variable++ or Variable--
지정문
지정 연산자 +=(더하기), -=(빼기), /=(나누기) 및 *=(곱하기)는 다음 형태로 C 프로그래밍 언어에서와 같이 작동합니다.
Variable += expression!
Variable -= expression!
Variable /= expression!
Variable *= expression!

예를 들면 다음과 같습니다.

$1 *= $2

위 지정문은 필드 변수 $1과 필드 변수 $2를 곱하고 그 결과를 $1에 지정합니다.

지정 연산자 ^=(지수화)와 %=(모듈러스)는 다음과 같은 형태를 가집니다.

Variable1^=expressionŋ

그리고

Variable2%=expressionŌ

위 지정문을 C 프로그램밍 언어로 작성하면 다음과 같습니다.

Variable1=pow(Variable1, expressionŋ)

그리고

Variable2=fmod(Variable2, expressionŌ)

여기서 powpow 서브루틴이고 fmodfmod 서브루틴입니다.

문자열 병합문
문자열 값을 나란히 놓음으로써 병합할 수 있습니다. 예를 들면, 다음과 같습니다.
$3 = $1 $2

위의 문자열 병합문은 필드 변수 $1$2의 문자열을 병합해 필드 변수 $3에 지정합니다.

내장 함수

awk 명령 언어는 산술 함수, 문자열 함수 및 일반 함수를 사용합니다. 파일을 작성하고 작성된 파일을 나중에 같은 프로그램에서 읽으려면 close 서브루틴문이 반드시 있어야 합니다.

산술 함수

다음 산술 함수는 동일한 이름의 C 언어 서브루틴과 같은 기능을 수행합니다.

atan2( y, x ) y/x의 아크탄젠트를 출력합니다.
cos( x ) x의 코사인 값을 출력합니다. x는 라디안 값입니다.
sin( x ) x의 사인 값을 출력합니다. x는 라디안 값입니다.
exp( x ) x의 지수 함수를 출력합니다.
log( x ) x의 자연 로그 값을 출력합니다.
sqrt( x ) x의 근을 출력합니다.
int( x ) x의 값을 절단하여 정수로 만듭니다.
rand( ) 난수 n을 리턴합니다. 여기서 0 <= n < 1.
srand( [Expr] ) rand 함수의 시드값을 Expr 매개변수에 맞추거나 Expr 매개변수가 생략되면 시각을 사용합니다. 이전 시드값이 출력됩니다.

문자열 함수

문자열 함수는 다음과 같습니다.

gsub( Ere, Repl, [ In ] ) 위 문자열 함수는 모든 정규 표현식이 대체된다는 것을 제외하면 sub 함수와 똑같이 수행됩니다.
sub( Ere, Repl, [ In ] ) In 매개변수가 지정한 문자열에 있는 Ere 매개변수가 지정하는 확장 정규식을 Repl에 의해 지정된 문자열로 대체합니다. sub 함수는 대체 횟수를 출력합니다. Repl 매개변수로 지정하는 문자열에 표시되는 &(앰퍼샌드)는 Ere 매개변수가 지정한 확장 정규식과 일치하는 In 매개변수의 문자열로 대체합니다. In 매개변수를 지정하지 않으면, 디폴트 값은 레코드 전체($0 레코드 변수)입니다.
index( String1, String2 ) String2 매개변수가 지정한 문자열이 String1 매개변수가 지정한 문자열 내에서 나타나는 위치를 출력합니다. 위치는 1부터 시작합니다. String2 매개변수가 String1 매개변수 안에 없으면 0(영)이 출력됩니다.
length [(String)] String 매개변수가 지정한 문자열의 길이를 출력합니다. String 매개변수를 지정하지 않으면, 전체 레코드($0 레코드 변수)의 길이가 출력됩니다.
blength [(String)] String 매개변수가 지정한 문자열의 길이를 바이트 단위로 출력합니다. String 매개변수를 지정하지 않으면, 전체 레코드($0 레코드 변수)의 길이가 출력됩니다.
substr( String, M, [ N ] ) N 매개변수가 지정한 수 만큼의 문자를 가지고 있는 부분 문자열을 출력합니다. 부분 문자열은 String 매개변수가 지정한 문자열 내에서, M 매개변수가 지정한 위치에 있는 문자로부터 시작하여 선택됩니다. M 매개변수는 String 매개변수의 첫번째 문자를 1로 하여 지정됩니다. 만약 N 매개변수를 지정하지 않으면, 부분 문자열의 길이는 M 매개변수가 지정한 위치에서 시작하여 String 매개변수의 끝까지입니다.
match( String, Ere ) Ere 매개변수가 지정한 확장 정규식이 String이 지정하는 문자열 내에 나타나는 위치를 출력합니다. 위치는 1부터 시작합니다. 만약 Ere 매개변수가 없으면 0이 출력됩니다. 리턴 값은 RSTART 특수 변수의 값으로 설정됩니다. RLENGTH 특수 변수의 값은 일치된 문자열의 길이에 맞추어지거나 일치되지 않으면 -1로 지정됩니다.
split( String, A, [Ere] ) String 매개변수가 지정한 문자열을 A[1], A[2], . . ., A[n] 배열 요소로 분할하고, n 변수의 값을 출력합니다. Ere 매개변수가 지정한 확장 정규식을 사용해 분할하거나 Ere 매개변수가 지정하지 않으면, 현재의 필드 분리자(FS 특수 변수)를 사용해 분할합니다. A 배열에 있는 모든 요소는, 문맥상 한 특별 요소가 수치값도 가져야만 하는 것이 아니라면, 문자 값을 사용해 작성됩니다.
tolower( String ) String 매개변수가 지정한 문자열을 대문자는 소문자로 바꾸어 출력합니다. 대문자, 소문자 매핑은 현행 로케일의 LC_CTYPE 범주에 의해 정의됩니다.
toupper( String ) String 매개변수가 지정한 문자열을 소문자는 대문자로 바꾸어 출력합니다. 대문자, 소문자 매핑은 현행 로케일의 LC_CTYPE 범주에 의해 정의됩니다.
sprintf(Format, Expr, Expr, . . . ) Expr 매개변수가 지정한 표현식을 Format 매개변수가 지정한 printf 서브루틴 서식 문자열에 따라 서식화하고, 서식화된 문자열을 출력합니다.

일반 함수

일반 함수는 다음과 같습니다.

close( expression! ) print 또는 printf문에 의하여 열려진 파일이나 파이프를 닫습니다. 또는 동일한, 문자열 값을 갖는 expression! 매개변수를 갖는 getline 함수에 대한 호출을 닫습니다. 파일이나 파이프가 성공적으로 닫혀지면, 0이 출력되고, 그렇지 않으면 0 아닌 값이 출력됩니다. 그렇지 않으면 0이 아닌 값이 출력됩니다. 파일을 작성하고 작성된 파일을 나중에 같은 프로그램 내에서 읽으려면 close문이 반드시 있어야 합니다.
system(Command ) Command 매개변수에 의하여 지정된 명령을 실행하고 종료 상태로 복귀합니다. 이 문은 system 서브루틴과 동등합니다.
expression! | getline [ Variable ] expression! 매개변수에 의하여 지정된 명령의 출력으로부터 파이프된 스트림으로부터 입력 레코드를 읽고, 레코드의 값을 Variable 매개변수가 지정한 레코드의 값으로 지정합니다. expression! 매개변수의 값을 이름으로 갖는 스트림이 현재 열려져 있지 않으면 스트림이 작성됩니다. 작성된 스트림은, Command 매개변수가 expression! 매개변수의 값을 취하고 Mode 매개변수가 r의 값으로 설정된 popen 서브루틴을 호출하여 작성한 스트림과 동등합니다. 스트림이 열려져 있고 expression! 매개변수의 값이 동일한 문자열로 평가되는 한, getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. 만약 Variable 매개변수를 지정하지 않으면, $0 레코드 변수와 NF 특수 변수는 스트림으로부터 읽은 레코드로 설정됩니다.
getline [ Variable ] < expression! expression! 매개변수에 의해 명명된 파일로부터 다음 입력 레코드를 읽고, Variable 매개변수가 지정한 변수를 레코드의 값으로 설정합니다. 스트림이 열려져 있고 expression! 매개변수의 값이 동일한 문자열로 평가되는 한, getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. 만약 Variable 매개변수를 지정하지 않으면, $0 레코드 변수와 NF 특수 변수는 스트림으로부터 읽은 레코드로 설정됩니다.
getline [ Variable ] Variable 매개변수가 지정한 변수를 현재 입력 파일의 다음 입력 레코드로 설정합니다. Variable 매개변수를 지정하지 않으면, $0 레코드 변수는 레코드의 값으로 설정되고 NF, NRFNR 특수 변수도 설정됩니다.

주: 모든 형태의 getline 함수는 성공적인 입력에 대해서는 1, 파일 끝에 대해서는 0 그리고 오류에 대해서는 -1을 출력합니다.

사용자 정의 함수

사용자 정의 함수는 다음 형식으로 선언됩니다.

function Name (Parameter, Parameter,...)  { Statements }

함수는 awk 명령 프로그램 어디에서든지 참조될 수 있고, 사용이 정의를 우선합니다. 함수의 유효 범위는 전역입니다.

함수의 매개변수는 스칼라나 배열입니다. 매개변수의 이름은 함수에만 유효합니다. 다른 모든 변수는 전역에 유효합니다. 다른 함수에 같은 이름을 사용해서는 안 됩니다. 예를 들어, 매개변수의 이름을 함수나 특수 변수의 이름으로 중복 사용하면 안 됩니다. 전역 유효범위를 갖는 변수는 함수의 이름을 공유해서는 안 됩니다. 스칼라와 배열은 동일 유효 범위에서 동일 이름을 가져서는 안 됩니다.

함수에 정의된 매개변수의 수는 함수가 호출될 때 사용되는 매개변수의 수와 일치할 필요는 없습니다. 초과(excess) 형식 매개변수는 국지 변수로 사용할 수 있습니다. 추가적인 스칼라 매개변수는 문자열 값을 공 문자열과 동등하게 하고, 수치 값을 0으로 설정함으로써 초기화됩니다. 추가적인 배열 매개변수는 공 배열로 초기화됩니다.

함수를 호출할 때, 함수 이름과 시작하는 괄호 사이에 공백 문자(white space)가 없어야 합니다. 함수 호출은 중첩될 수 있고 회귀적일 수 있습니다. 중첩되고 회귀된 함수 호출로부터 복귀할 때, 참조에 의해서 전달되는 배열을 제외하면, 모든 호출 함수의 매개변수의 값은 변하지 않아야 합니다. return문을 사용해 값을 출력할 수 있습니다.

함수 정의 내에서 개행 문자는 시작하는 {(중괄호) 앞과 마치는 }(중괄호) 뒤에 선택적으로 둘 수 있습니다.

다음은 함수 정의의 예입니다.

function average ( g,n) 
  {
        for (i in g)
           sum=sum+g[i]
        avg=sum/n
        return avg
  } 

배열 g와 배열 요소의 수를 나타내는 변수 n이 함수 average에 패스됩니다. 그러면 함수는 평균을 구하고 그 값을 출력합니다.

조건문

awk 명령 프로그래밍 언어로 된 대부분의 조건 명령문은 C 프로그래밍 언어로 된 조건문과 동일한 구문 및 함수를 같습니다. 모든 조건문은 명령문을 함께 그룹화하기 위해 { }(중괄호)의 사용을 허용합니다. 조건문의 표현식 부분과 문 부분사이에 선택적인 개행을 사용할 수 있습니다. ;(세미콜론)을 사용해 { }(중괄호) 안에 있는 다중 문을 구분합니다. C 언어의 여섯 가지 조건문은 다음과 같습니다.

if 다음과 같은 구문을 필요로 합니다.

if ( expression! ) { Statement } [ else Action ]

while 다음과 같은 구문을 필요로 합니다.

while ( expression! ) { Statement }

for 다음과 같은 구문을 필요로 합니다.

for ( expression! ; expression! ; expression! ) { Statement }

break while이나 for문에 break문을 사용하면 프로그램 루프가 종료됩니다.
continue while이나 for문에 continue문을 사용하면 프로그램문은 다음 번 반복(iteration)으로 이동합니다.

C 언어 규칙을 따르지 않는 다섯 가지 awk 명령 프로그래밍 언어 조건문은 다음과 같습니다.

for...in 다음과 같은 구문을 필요로 합니다.

for ( Variable in Array ) { Statement }

for...in문은 Variable 매개변수를 Array 변수의 각 색인 값에 한번에 하나씩 특별한 순서 없이 설정하고, 루프가 반복될 때마다 Statement 매개변수가 지정한 조치를 실행합니다. for...in문에 대한 예제는 delete문을 참조하십시오.

if...in 다음과 같은 구문을 필요로 합니다.

if ( Variable in Array ) { Statement }

if...in문은 Array 요소가 존재하는지 탐색합니다. Array 요소가 발견되면 명령문이 수행됩니다.

delete 다음과 같은 구문을 필요로 합니다.

delete Array [ expression! ]

delete문은 Array 매개변수에 의해 지정된 배열 요소와 expression! 매개변수가 지정한 색인을 모두 삭제합니다. 예를 들면 다음과 같습니다.

for (i in g)
   delete g[i];

위의 예는 g[] 배열의 모든 요소를 삭제합니다.

exit 다음과 같은 구문을 필요로 합니다.

exit [ expression! ]

exit문은 우선 모든 END 조치를 일어나는 순서대로 호출하고, 그리고 expression! 매개변수가 지정한 종료 상태로 awk 명령을 종료합니다. exit문이 END 조치 내에서 발생하면 후속 END 조치는 호출되지 않습니다.

# 다음과 같은 구문을 필요로 합니다.

# Comment

# 명령문은 주석을 지정합니다. 주석은 항상 개행으로 끝나야 하지만 행 중 어디에서든지 시작할 수 있습니다.

next 현재 입력 레코드의 처리를 중지하고 다음 입력 레코드로 넘어갑니다.

출력문

awk 명령 프로그래밍 언어의 두 출력문은 다음과 같습니다.

print 다음과 같은 구문을 필요로 합니다.

print [ expression!List ] [ Redirection ] [ expression! ]

print문은 expression!List 매개변수가 지정한 각 표현식의 값을 표준 출력 장치에 출력합니다. 각 표현식은 OFS 특수 변수의 현재 값에 의해 구분되고, 각 레코드는 ORS 특수 변수의 현재 값에 의해 종료됩니다.

Redirection 매개변수를 사용해 출력 방향을 전환할 수 있는데, Redirection 매개변수는 출력 방향을 > (보다 크다), >> (이중 크다 기호) 그리고 |(파이프)를 사용해 세 가지로 전환할 수 있습니다. Redirection 매개변수는 출력 방향을 지정하고, expression! 매개변수는 파일의 경로 이름(Redirection 매개변수가 > 또는 >> 인 경우)이거나 명령의 이름이다(Redirection 매개변수가 |인 경우).

printf 다음과 같은 구문을 필요로 합니다.

printf Format [ , expression!List ] [ Redirection ] [ expression! ]

printf문은 expression!List 매개변수가 지정한 표현식을 Format 매개변수가 지정한 형식으로 표준 출력에 기록합니다. printf문은 c 변환 스펙(%c)을 제외하면 printf 명령과 똑같은 기능을 합니다. Redirectionexpression! 매개변수는 print 문에서와 같은 가능을 합니다.

c 변환 스펙: 인수가 수치 값을 가지고 있으면, 코드화했을 때 그 값을 갖는 문자가 출력됩니다. 값이 0이거나 문자 세트에 있는 문자의 코드가 아니면, 변환은 정의되지 않습니다. 인수가 수치 값을 가지고 있지 않으면, 문자열 값의 최초 문자가 출력됩니다. 문자열이 아무런 문자도 포함하고 있지 않으면, 변환은 정의되지 않습니다.

주: 만약 expression! 매개변수가 Redirection 매개변수에 대한 경로 이름을 지정하면, expression! 매개변수는 문자열로 취급되도록 하기 위하여 큰따옴표로 묶어야 합니다.

변수

변수는 스칼라, 필드, 변수, 배열 또는 특수 변수가 될 수 있습니다. 변수의 이름은 숫자로 시작해서는 안 됩니다.

변수는 참조하기만 하면 사용할 수 있습니다. 함수의 매개변수를 제외하면, 함수는 명시적으로 선언되지 않습니다. 초기화되지 않은 스칼라 변수와 배열 요소는 수치 값 0(영)과 문자열 값인 공 문자열(" ")을 취합니다.

변수는 문맥 처리 정보에 따라 수치 값이나 문자열 값을 취합니다. 각 변수는 수치 값, 문자열 값 또는 둘다를 가질 수 있습니다. 예를 들면, 다음과 같습니다.

x = "4" + "8"

12의 값을 변수 x에 지정합니다. 문자열 상수의 경우, 표현식을 " "(큰따옴표) 기호 안에 넣어야 합니다.

수치와 문자열간의 명시적인 변환은 없습니다. 표현식이 수치로 취급되게 하려면, 표현식에 0을 추가하십시오. 표현식이 문자열로 취급되게 하려면, 표현식에 널 문자열(" ")을 추가하십시오.

필드 변수

필드 변수는 $(달러 사인) 다음의 숫자나 수식으로 지정됩니다. 레코드의 첫번째 필드에는 $1 변수가 할당되고, 두 번째 필드에는 $2 변수가 할당되고, 나머지 필드도 마찬가지로 변수가 할당됩니다. $0 필드 변수는 전체 레코드에 지정됩니다. 새 필드 변수는 값을 지정하여 생성될 수 있습니다. 존재하지 않는 필드 즉, $NF 필드 변수의 현재 값보다 큰 필드에 값을 지정하면, 두 값 사이에 있는 필드가 생성되고 (널 문자열로 설정) NF 특별 변수의 값이 증가하고 $0 레코드 변수의 값이 재계산됩니다. 새 필드는 현재 필드 분리자(FS 특수 변수의 값)로 구분됩니다. 공백 및 탭은 디폴트 필드 구분자입니다. 필드 분리자를 변경하려면, -F 플래그를 사용하거나, FS 특수 변수를 awk 명령 프로그램의 다른 값으로 지정하십시오.

배열

배열은 처음에는 비어 있고, 그 크기는 동적으로 변합니다. 배열은 첨자를 가지고 있는 변수를 [ ](대괄호)로 나타냅니다. 첨자 또는 요소 식별자는 결합적 배열 능력을 제공하는 여러 문자가 될 수 있습니다. 예를 들면 다음과 같습니다.

/red/  { x["red"]++ }
/green/ { y["green"]++ }

위의 프로그램은 red 계수기와 green 계수기의 값을 증가시킵니다.

몇 몇 프로그래밍 언어의 다차원 배열처럼 배열은 하나 이상의 첨자로 색인화될 수 있습니다. awk 명령에 대한 프로그래밍 배열은 실제로는 1차원이기 때문에, 쉼표에 의해 구분된 첨자는 각 표현식의 문자열 값을 병합함으로써 단일 문자열로 변환할 수 있습니다. 각 표현식은 SUBSEP 환경 변수의 값으로 구분됩니다. 따라서, 다음 두 색인 연산은 동등합니다.

x[expr1, expr2,...exprn]

그리고

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

in 연산자를 사용할 때, 다차원 Index 값은 괄호 속에 넣어야 합니다. in 연산자의 경우를 제외하면, 존재하지 않은 배열 요소를 참조하면 그 요소가 자동으로 생성됩니다.

특별 변수

다음 변수는 awk 명령에 대해 특별한 값을 가지고 있습니다.

ARGC ARGV 배열의 요소 수. 이 값은 변경될 수 있습니다.
ARGV 각 요소가 File 변수와 Assignment 변수 중 하나를 가지고 있는 배열. 이 배열은 명령 행으로부터, 0(영)에서 ARGC -1까지 번호가 매겨져 입력됩니다. 각 입력 파일의 입력이 완료되면, ARGV 배열의 다음 구성원은 다음과 같은 경우가 발생하지 않는한 다음 입력 파일의 이름을 제공합니다.
  • 다음 구성원이 Assignment문입니다. 이 경우, 지정이 평가됩니다.
  • 다음 구성원이 널 값을 가지고 있습니다. 이 경우, 구성원은 생략됩니다. 입력 파일을 포함하고 있는 ARGV 배열을 널 값에 지정함으로써 프로그램은 선택된 입력 파일을 생략할 수 있습니다.
  • 다음 구성원은 awk 명령이 입력 파일의 끝이라고 해석하는 ARGV [ARGC -1]의 현재 값입니다.
CONVFMT 숫자를 문자열로 변환하기 위한 printf 서식(OFMT 특별 변수가 사용되는 출력문은 제외). 디폴트는 "%.6g"입니다.
ENVIRON awk 명령이 수행되는 환경을 나타내는 배열. 배열의 각 요소는 다음과 같은 양식으로 되어 있습니다.

ENVIRON [ "Environment VariableName" ] = EnvironmentVariableVal!ue

awk 명령이 실행되기 시작할 때, 값이 정해집니다. 환경은 ENVIRON 특별 변수의 변경 여부에 상관없이 실행 종료시까지 사용됩니다.

FILENAME 현재 입력 파일의 경로 이름. BEGIN 조치가 실행되는 동안, FILENAME의 값은 정의되어 있지 않습니다. END 조치가 실행되는 동안, 값은 처리된 최종 입력 파일의 이름입니다.
FNR 현재 파일의 현재 입력 레코드의 번호.
FS 입력 필드 분리문자. 디풀트 값은 공백입니다. 입력 필드 분리문자가 공백이면 로케일에 정의된, 필드를 구분하는 공백의 수는 제한이 없습니다. FS 특별 변수는 두 가지 추가적인 값을 취할 수 있습니다.
  • FS를 단일 문자로 설정하면 필드는 그 문자에 의해 구분됩니다.
  • FS확장 정규식으로 설정하면, 확장 정규식과 일치하는 문자열이 필드를 구분합니다.
NF 현재 레코드의 필드의 개수. 상한값은 99입니다. BEGIN 조치 내에서, NF 특별 변수는 Variable 매개변수를 가지고 있지 않은 getline 함수가 이전에 사용되지 않았으면 정의되지 않습니다. END 조치 내에서, NF 특별 함수는 Variable 매개변수를 가지고 있지 않은, 재지정된 후속 getline 함수가 END 조치에 들어가기 전까지 사용되지 않는 한 최종적으로 읽은 레코드에 대해 가졌던 값을 보유합니다.
NR 현재 입력 레코드의 번호. BEGIN 조치 내에서, NR 특별 변수의 값은 0(영)입니다. END 조치 내에서, 값은 처리된 최종 레코드의 번호입니다.
OFMT 출력문에서 숫자를 문자열로 변환하기 위한 printf 형식. 디폴트 값은 "% .6g"입니다.
OFS 출력 필드 분리문자(디폴트는 공백입니다.)
ORS 출력 레코드 분리문자(디폴트는 개행문자입니다.)
RLENGTH match 함수에 의해 일치된 문자열의 길이
RS 입력 레코드 분리문자(디폴트는 개행문자입니다.) RS 특수 변수가 널이면, 레코드는 하나 이상의 공백 행으로 구분됩니다. 후미에 오는(trailing) 공백 행은 입력의 시작이나 끝에서 공백 레코드가 되지는 않습니다. 개행 문자는 FS 특별 변수의 값과는 상관없이 항상 필드 분리문자입니다.
RSTART match 함수에 의해 일치된 문자열의 시작 위치. 위치는 1부터 번호가 매겨집니다. 이 위치는 match 함수의 리턴 값과 등가입니다.
SUBSEP 다중 첨자를 구분합니다. 디폴트는 \031입니다.

플래그

-f ProgramFile ProgramFile 변수가 지정한 파일로부터 awk 명령에 대한 명령을 확보합니다. 만약 -f 플래그가 여러 번 지정되면 지정된 순서로 병합된 파일이 명령어 집합으로 사용됩니다.
-F Ere Ere 변수가 지정한 확장 정규식을 필드 분리문자로 사용합니다. 디폴트 필드 분리문자는 공백입니다.
-v Assignment awk 명령의 프로그래밍 언어의 변수에 값을 지정합니다. Assignment 매개변수는 Name = Value 형식입니다. Name 부분은 변수의 이름을 지정하고, 밑줄, 숫자 그리고 알파벳의 어떠한 조합이어도 되지만 알파벳 또는 밑줄로 시작해야 합니다. Value 부분도 또한 밑줄, 숫자, 알파벳으로 구성되고, 마치 앞뒤에 "(문자열의 경우처럼 큰따옴표)가 있는 것처럼 취급됩니다. 만약 Value 부분이 수치라면, 변수 또한 수치 값이 지정됩니다.

-v 플래그에 의해 지정된 지정은 BEGIN 부분을 비롯한 awk 명령 프로그램의 어느 부분도 일어나기 전에 실행됩니다.

Assignment awk 명령의 프로그래밍 언어의 변수에 값을 지정합니다. 매번 처리되는 것만 제외하고, -v 플래그가 있는 Assignment 변수와 동일한 양식과 기능을 갖습니다. Assignment 매개변수는 명령 행에서 이 매개변수 다음에 오는 입력 파일(File 변수로 지정) 이전에 처리됩니다. Assignment 매개변수가 여러 개 입력 파일 중 최초 파일 앞에 지정되는 경우, 지정은 BEGIN절(있는 경우) 다음에 처리됩니다. Assignment 매개변수가 최종 파일 다음에 발생하는 경우, 지정은 END절(있는 경우) 앞에서 처리됩니다. 입력 파일이 지정되지 않은 경우, 지정이 처리되고 표준 입력을 읽습니다.
File 처리될 입력을 포함하고 있는 파일 이름을 지정합니다. File 변수를 지정하지 않거나 -(빼기) 부호를 지정하면, 표준 입력이 처리됩니다.
'Program' awk 명령에 대한 명령을 포함합니다. -f 플래그를 지정하지 않으면, Program 변수는 명령 행의 첫번째 항목이어야 합니다. ' '(작은따옴표)로 묶어야 합니다.

종료 상태

이 명령은 다음과 같은 종료 값으로 복귀합니다.

0 성공적으로 완료되었습니다.
>0 오류가 발생하였습니다.

exit [ expression! ] 조건문을 사용하여 프로그램 내에서 종료 상태를 변경할 수 있습니다.

예제

  1. 72자보다 긴 행을 표시하려면 다음과 같이 입력하십시오.
    awk  'length  >72'  chapter1
    위의 명령은 72자보다 긴, chapter1 파일의 행을 선택하고 Action가 지정되지 않았기 때문에 선택된 행을 표준 출력 장치에 출력합니다. 탭 문자는 1바이트로 계수됩니다.
  2. "start""stop"을 포함하여, 단어 startstop간의 모든 행을 표시하려면, 다음을 입력하십시오.
    awk  '/start/,/stop/'  chapter1
  3. 파일 chapter1을 처리하는 awk 명령 프로그램 sum2.awk을 실행하려면 다음과 같이 입력하십시오.
    awk  -f  sum2.awk  chapter1
    다음 프로그램 sum2.awk는 입력 파일 chapter1의 두 번째 열에 있는 숫자의 합계와 평균을 계산합니다.
        {
           sum += $2
        }
    END {
           print "Sum: ", sum;
           print "Average:", sum/NR;
        }
    첫번째 조치는 각 행의 두 번째 필드의 값을 sum이라는 변수에 더합니다. 모든 변수는 처음 참조될 때 0(영) 수치 값으로 초기화됩니다. 두 번째 조치 앞에 있는 패턴 END 입력 파일을 모두 읽은 후 조치를 실행하게 합니다. 평균을 구하기 위하여 사용되는 NR 특별 변수는 지금까지 읽은 레코드의 수를 나타내는 특별 변수입니다.
  4. 최초 두 필드를 역순으로 인쇄하려면, 다음과 같이 입력하십시오.
    awk '{ print $2, $1 }' chapter1
  5. 다음 awk 프로그램 sum3.awk는 입력 필드가 쉼표와/또는 공백 그리고 탭으로 구분되어 있는 chapter2 파일의 최초 두 필드를 인쇄하고 첫번째 열을 더하여 합계와 평균을 인쇄합니다.
    BEGIN  {FS = ",|[ \t]+"}
           {print $1, $2}
           {s += $1}
    END    {print "sum is",s,"average is", s/NR }







(1) 예제 입력 파일 소개
① 입력화일의 이름은 students
② 이 파일의 각 라인은 3개의 필드로 구성(학생 성명, 학과명, 나이)
③ 각 필드는 공백에 의해서 분리(공백을 필드 분리자로 간주함.)
< awk는 각 라인에서 필드를 추출해 내는 데 필드 분리자(field separator)를 사용, 필드 분리자는 보통 하나 이상의 공백 문자이다.>

1) 입력화일 예제 students

% cat students
John,P Physics 20
Rick,L Mechanical 21
Jack,T electrical 23
Larry,M Chemical 22
Phil,R Electrical 21
Mike,T mechanical 22
Paul,R Chemical 23
John,T Chemical 23
Tony,N Chemical 22
James,R Electrical 21


예 1) 식(expression!)에 맞는 field 프린트하기
% awk '$3 > 22 {print $1}' students
Jack,T
Paul,R
John,T

예 2) if 문을 사용하여 조건에 맞는 line 분리하기(각 파일에 저장)

step 1 : if문을 사용하는 프로그램을 awkprog1이라는 파일로 만든다.

% cat awkprog1
{ if ($1 ~ /^J/) printf "%s\n", $0 > "Jfile"
if ($1 ~ /^P/) printf "%s\n", $0 > "Pfile"}

step 2 : students 입력화일에 awkpog1 프로그램 화일을 적용한다.

% awk -f awkprog1 students

step 3 : 결과 보기
% cat Jfile
John,P Physics 20
Jack,T electrical 23
John,T Chemical 23
James,R Electrical 21

% cat Pfile
Phil,R Electrical 21
Paul,R Chemical 23


예 3) 평균값 구하기

<프로그램 awkprog2, awkprog3>

% cat awkprog2
{sum += $3}
END {printf "The average of the ages is %.2f\n", sum/NR}

% cat awkprog3
{sum += $3
++no}
END {printf "The average of the ages is %.2f\n", sum/no}

<결 과>
% awk -f awkprog3 students
The average of the ages is 21.80


예 4) while 과 do문을 이용하여 평균값 구하기

<프로그램 awkprog4>
% cat awkprog4
{if (NF > 0) {
sum = 0
n = 1
while (n <= NF) {
sum = sum + $n
n = n+1
}
printf "Average is %d\n", sum/NF
}
else
print}

<예 제>
% awk -f awkprog4 test
Average is 17
Average is 3
Average is 25
Average is 0






관련 정보

명령: egrep, fgrep, grep, lex, printf, sed.

서브루틴: popen, printf, system.

책자: Aho, A.V., Kernighan, B.W.와 Weinberger, P.J. Awk 프로그래밍 언어. Bell Telephone Laboratories, Incorporated, 1988.