'awk'에 해당되는 글 5건

  1. 2012.10.15 AWK 명령어 기초 (두개 텍스트 파일 조건 합치기)
  2. 2012.08.28 GNU Awk 사용자 가이드/함수
  3. 2012.08.28 GNU Awk 사용자 가이드/변수
2012. 10. 15. 21:21

AWK 명령어 기초 (두개 텍스트 파일 조건 합치기)

AWK

  1. awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다
    표준 출력을 리다이렉션할 수 있다 
  2. 사용법
    • awk   [옵션]   '스크립트'   [-v 변수=값]   [파일(들)]
    • awk   [옵션]   -f  스크립트 파일   [-v 변수=값]   [파일(들)]
    • cf) 편집 스크립트 파일의 사용법
      • ed  : ed -s(script) sourcefile < scriptfile
      • sed :  sed -f(file) scriptfile sourcefile > outputfile
      • awk : awk -f(file) scriptfile sourcefile > outputfile
  3. 옵션
    • -Fc  :  field separator 지정
      • c는 필드 사이를 구분하는 구분자이다
      • 직접 지정하지 않으면 공백을 기준으로 한다
      • 시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다
    • -v  변수 = 값
      • 스크립트를 실행하기 전에 미리 변수를 지정하여 준다
    • -f  스크립트 파일
      • 스크립트를 파일에서 가져온다  
      • -f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다 
  4. 스크립트
    • 패턴 { 동작 }
      커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
      • 패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다 
      • 동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다
    • 패턴
      1. /정규표현식/
        sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다   또한
        ^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다
      2. 비교연산
        숫자 기준, 알파벳 기준 모두 사용 가능하다 
      3. 패턴 매칭 연산
        ~  :  일치하는 부분을 나타낸다
        !~ :  일치하지 않는 부분을 나타낸다
      4. BEGIN
        첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다 
      5. END
        마지막 레코드가 모두 읽혀진 후 어떤 동작을 정의하여 실행하고 싶을 때 사용한다 
    • 동작
      • 동작은 모두 { }로 둘러싸야 한다
      • 예제
        • good이라는 문자열을 포함하는 모든 레코드를 출력할 때
          /good/
        • 각 레코드의 첫 번째 필드를 출력할 때
          { print $1 } 
        • good이라는 문자열을 포함하는 레코드의 첫 번째 필드를 출력할 때
          /good/ { print $1 } 
        • 두 개 이상의 필드를 가지는 레코드를 전부 출력할 때(비교연산)
          NF > 2
        • 한 라인(n)을 필드로, 빈 라인("")을 레코드로 구분할 때
          BEGIN { FS = "n" ;  RS = ""} 
        • 첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를 나중에 출력하고 싶을 때
          $1 ~ /good/ { print  $3 ,  $2 }
        • good이라는 문자열이 몇 개나 들어가 있는지 계산하여 마지막 부분에서 출력하고 싶을 때
          /good/ { ++x }
          END { print x } 
        • 두 번째 필드를 모두 합하고 마지막 부분에서 두 번째 필드의 총합계를 출력하고 싶을 때
          { total += $2 }
          END { print "Total of $2: " ,  total } 
        • 레코드의 길이가 20자 이하인 것을 출력하고 싶을 때
          length($0) < 20 
        • 네 개의 필드를 가지며 good이라는 단어로 시작하는 모든 레코드를 출력하고 싶을 때
          NF == 4  &&  /^good/
        • 빈줄을 제외한 모든 줄을 화면에 출력한다
          NF > 0
  5. awk 시스템 변수
      FILENAME
      현재 파일명
      $0
      입력 레코드
      FS
      입력 필드 구분
      디폴트 :  공백
      $n
      입력 레코드의 N번째 필드
      NF
      현재 레코드 필드 갯수
      ARGC
      커맨드 라인의 인자 갯수
      NR
      현재 레코드 번호
      ARGV
      커맨드 라인 인자를 포함하는 배열
      OFMT
      숫자에 대한 출력 포맷
      디폴트 :  %.6g
      ENVIRON
      환경 변수들을 모아둔 관계형 배열
      OFS
      출력 필드 구분
      디폴트 :  빈줄
      FNR
      NR과 동일
      단지 현재 파일에 적용된다는 점이 다름
      ORS
      출력 레코드 구분
      디폴트 :  newline
      RSTART
      지정한 매칭 연산을 만족하는 문자열의 맨 앞부분
      RS
      입력 레코드 구분
      디폴트 :  newline
      RLENGTH
      지정한 매칭 연산을 만족하는 문자열의 길이
  6. awk 연산자
      산술 : =, +=, -=, *=, /=, %=
      조건 : ? :
      논리 : ||, &&, !
      패턴 : ~, !~
      비교 : <, <=, >, >=, !=,==
      증감 : ++, --
      필드참조 : $
  7. 제어문(C의 제어문과 같다)
    • break
    • continue
    • do {실행} while (조건)
    • exit
    • for (관계형 배열의 요소) {실행}
      펄의 foreach와 같다
    • if (조건) {실행} else {실행}
    • return
    • while
  8. awk 명령어
    • 문자열 연산
      • gsub(reg,s)
        입력 문자열의 전반에 걸쳐 정규표현식 r을 문자열 s로 대치한다
      • gsub(reg,s1,s2)
        문자열 s2에서 정규표현식 r을 s1으로 대치한다 
      • index(s1,s2)
        s1에서 s2의 위치를 넘겨준다  만약 없다면 0을 넘겨준다 
      • length(arg)
        인자의 길이를 넘겨준다 
      • match(s,r)
        문자열 s에서 정규표현식 r과 매칭되는 부분의 위치를 넘겨준다 
      • split(string,array[,seperator])
        구분자를 기준으로(지정하지 않으면 공백 기준)해서 지정한 문자열을 배열로 만든다  배열[1],  배열[2], ....... 
      • sub(r,s),  sub(r,s1,s2)
        gsub과 동일하다
        단지 정규표현식과 일치하는 문자열이 여러개라도 처음 문자열만 대치된다
      • substr(s,m)
        문자열 s에서 m번째 위치에서 끝까지의 문자를 리턴한다 
      • substr(s,m,n) 
        문자열 s에서 m번째 위치에서 n번째까지의 문자를 리턴한다 
      • tolower(str)
      • toupper(str)
    • 수치 연산
      • atan2(x,y)
        y/x의 arctangent값을 라디안 단위로 넘겨준다 
      • cos(x)
      • exp(arg)
      • int(arg)
      • log(arg)
      • rand() 
        0과 1사이의 난수를 발생한다 
      • sin(x)
      • sqrt(arg)
      • srand(expr)
        인자를 가지고 난수를 발생한다
        인자가 주어지지 않으면 시간을 가지고 난수를 발생한다 
    • 입출력/프로세스
      • close(filename)
        지정한 파일을 닫는다 
      • close(cmd)
        지정한 명령어 파이프를 닫는다 
      • delete array[element]
        지정한 배열 요소를 지운다 
      • getline()
        다음 레코드를 읽어 들인다 
      • getline[variable] [< "filename"]
        파일에서 읽어들인다 
      • next 
        다음 레코드(라인)을 입력받는다
        getline()과 유사하지만 /패턴/동작을 새롭게 시작한다
        getline()은 다음 라인을 읽기만 한다 
      • print [args] [> "filename"]
        인자를 출력한다 
      • printf "format" [,expressions] [> "filename"] 
        형식에 맞춰 출력한다 
      • sprintf (format [,expressions]) 
        printf와 마찬가지로 사용하는데 값을 리턴하기만 하고 출력은 하지 않는다 
      • system(command) 
        시스템 내부 명령어를 실행한다 
  9. 간단한 예
    • awk  ' BEGIN { for (i = 1;i<=7,i++)  print int(101*rand()) }'
      화면에 1이상 100이하의 난수 일곱 개를 출력한다
    • ls -l  file1  file2  file3  | awk  ' { x += $5 } ;  END { print "Total bytes :  " x } '
      파일들의 크기를 모두 합하여 총 바이트 수를 표시한다
    • awk  ' END { print NR } ' filename
      지정한 파일의 라인이 몇 개인지를 표시한다
    • awk  ' NR % 2 == 0 ' 
      지정한 파일의 짝수번째의 라인만을 출력해 준다 


출처 : http://4ellene.net/



Trackback 0 Comment 0
2012. 8. 28. 10:13

GNU Awk 사용자 가이드/함수

함수란 입력받은 Input을 일정한 규칙에 따라 처리한 뒤 Output을 내놓는 것이다. 예를 들어 어떤 함수 x에 input을 넣었을 때 input값에 1만큼 증가한 값이 output으로 나온다면 이 함수는 +1을 해주는 함수라고 할 수 있다. awk에서 함수는 보통 다음과 같은 기본형을 갖는다

function(input1,input2,...)
  return

input의 개수는 함수마다 다르며, 사용자 정의 함수의 경우 사용자가 필요한 만큼 지정해 줄 수 있다.

awk에서는 함수가 크게 두 부류로 나누어진다. 하나는 awk에 이미 내장되어 있는 내장함수Built-In Function인데, 이 함수들은 사용자가 원하는 경우 언제든지 불러와서 사용할 수 있다. 다른 하나는 사용자 정의 함수로서, 사용자가 프로그램의 목적에 따라 임의로 규칙을 만들어낸 함수를 가르킨다. 사용자 함수의 이름과 형식은 자유롭게 정할 수 있으나 이미 내장된 함수들의 이름을 사용할 수는 없다.

이 문서의 전반부는 awk에 내장된 함수들의 종류를 설명하고, 후반부에서는 사용자 정의 함수의 작성방법을 간단히 설명한다.


내장 함수

내장함수는 사용자가 만드는 awk프로그램에서 항상 사용할 수 있는 함수이다. awk의 내장 함수는 다섯 가지 정도로 분류된다.

Numeric Functions

Numeric Function은 수치 정보를 처리하는 함수들을 뜻한다. 아래의 목록은 awk에 내장된 수치 함수의 이름과 설명을 담고 있다.

함수명설명
int(x)x에서 가장 가까운 정수 값을 return한다
sqrt(x)x의 양의 제곱근을 return
exp(x)x를 지수로, 자연상수 e를 밑으로 하는 지수함수 return
log(x)x의 자연로그값을 return
sin(x)x의 sin값을 return
cos(x)x의 cos값을 return
atan(y,x)x의 arctangent값을 return
rand()0과 1사이의 범위에서 random number를 return
srand([x])rand 기능과 관련하여 시작점이나 seed 설정

String-Manipulation Functions

문자열 함수는 하나 또는 여러 문자열의 text를 보거나, 변화시키는 기능을 갖고 있다. 아래의 목록은 문자열 함수의 이름과 기능을 나열한 것이다.

함수명설명
asort#(source[,dest])array source에서 요소들을 정렬해서 return
asorti(source[,dest])rray source에서 요소들을 index를 기준으로 정렬해서 return
index(in,find)주어진 string이 포함된 문자열을 검색해서 return
length(string)주어진 input의 철자 수를 세서 return
match(string, regexp, [, array])string에서 regular expression의 위치를 return
split(string,array,[,fieldsep])fieldsep에 따라 string을 쪼개고 각각을 저장
sprintf(format, expression1,...)printf와 같은 용도이지만 값을 return하기만 할 뿐 출력하지 않는다
strtonum(str)문자열을 숫자로 변환, 문자열의 종류에 따라 8진수,16진로 파악하기도 함
sub(regexp, replacement[, target])regexp에 해당하는 문자열을 replace로 대치시킴
gsub(regexp, replacement[, target])매치되는 모든 string을 replace로 대치시킴
gensub(regexp, replacement[, target])original string의 값이 변하지 않은 채로 매치되는 값들만 return
substr(string, start[, length])start에서 시작해 length만큼의 길이까지 문자열을 return한다
tolower(string)해당 문자열의 대문자를 소문자로 바꿔서 출력
toupper(string)해당 문자열의 소문자를 대문자로 바꿔서 출력

Input/Output Function

입출력 데이터와 관련된 함수들의 목록은 아래와 같다.

함수명설명
close(filename [,how])filename에 해당하는 파일을 닫는다
system(command)operating-system의 명령어를 실행하고 이를 awk에 return
getline()처리된 output을 다음 레코드의 input으로 받는다.
printf()내용을 그대로 return하면서 안에서 변수를 순서대로 받아 입력한 string과 같이 출력

Time Functions

awk에서 제공하는 시간정보 관련 함수이다.

함수명설명
systime()현재시간을 초단위까지 return
mktime(datespec)systime으로부터 받은 시간을 dataspec에 입력
strftime([format[,timestamp[,ufc-flag]]])ufc-flag에서 받은 시각(표준시각)을 문자로 표현, 기본 포맷인 경우 '%a,%A...'와 같은 문자열로 출력된다.

Bit-Manipulation Functions

비트값을 처리하는 Function으로써 불 대수값을 출력하는 함수와 자리를 이동하며 처리하는 함수로 구성된다. 목록은 다음과 같다.

함수명설명
and(v1,v2)입력된 값들의 AND연산 값 출력 1 1인 경우 1출력
or(v1,v2)입력된 값들의 or연산 값 출력 0 0인 경우를 제외하고 1출력
xor(v1,v2)입력된 값들의 xor연산 값 출력, 1 0 또는 0 1인 경우 1 출력
lshift(val)카운트된 bit만큼 왼쪽으로 이동한 값을 return
rshift(val)카운트된 bit만큼 오른쪽으로 이동한 값을 return

사용자 정의 함수

사용자 정의 함수는 awk 프로그램의 내부 어디에서든 만들고 사용할 수 있다. 일단 프로그램 내에서 함수가 정의된 후에는 다시 정의하지 않고 바로 적용하여 편리하게 사용할 수 있다.

함수의 기본 정의방식

awk에서 함수는 보통 다음과 같은 형식으로 만들어진다.

 function name(parameter1, parameter2,..)
        {
                body- of- function
        }

name은 함수의 이름을 가리키고, parameter는 함수에 들어가는 input을 의미한다. body of function은 본격적인 함수의 내용을 가리킨다.

함수의 예시

m부터 n까지를 더한 결과값을 내는 함수를 만들어보자. 임의로 함수의 이름을 sum(m, n)으로 정하자. 소스 코드는 아래와 같다

 function sum(start, end){ 
        total = 0;
        for (i = start; i<= end; i++) {
                total = total + i;
        }
        return total;
}

위와 같이 프로그램 내에서 함수를 정의한 후 그 다음부터는 같은 연산이 필요할 때마다 함수로 간단하게 입력해서 사용할 수 있다.


출처 : ko.wikibooks.org


Trackback 0 Comment 0
2012. 8. 28. 10:05

GNU Awk 사용자 가이드/변수

Variable의 개념

변수란 data를 비롯하여 프로그램이 처리하는 값의 이름을 가리키는 말입니다. 예를 들어 아래와 같은 자료가 있다고 합시다.

몸무게시력
180681.2
175600.4
168552.0

이 때 키, 몸무게, 시력과 같이 data를 분류하고 설명하는 이름들을 변수라고 할 수 있습니다. 만약 각각의 항목에 대하여 평균을 구한다고 하면 '평균'이란 요소 역시 변수의 하나가 됩니다.

awk에서는 변수를 크게 두 종류로 나눌 수 있습니다. 하나는 사용자가 임의로 자유롭게 만들 수 있는 사용자 정의 변수입니다. 프로그램의 목적에 따라서 사용자가 마음에 들어하는 이름으로 변수를 만들 수 있습니다. 다른 하나는 내장변수(Built-In Variable)란 것으로, awk에서 이미 만들어놓은 변수들입니다. 이 변수들은 각각 특정한 성질과 의미들을 갖고 있습니다. 내장변수들에 사용된 이름들은 사용자가 임의로 바꿀 수 없고 같은 이름으로 사용자 변수를 만드는 것도 불가능합니다.

Built-In Variable

대부분의 awk 변수들은 사용자의 목적에 따라 이용이 가능합니다. 사용자의 프로그램이 그것들에 값을 바꾸기 전까지 변수들은 바뀌지 않으며 프로그램이 변수들을 사용하지 않는 한 그것들은 어떠한 영향도 미치지 않습니다. 하지만 awk의 일부 변수들은 특별하면서 내장된 의미를 갖고 있습니다. 내장변수는 크게 두 부류로 나눌 수 있는데 하나는 awk가 자동적으로 사용함으로써 사용자가 awk에게 어떤 일들을 하라고 명령이 가능하게 하는 변수들입니다. 나머지는 awk에 의해 자동적으로 설정됨으로써 awk의 내부 작업으로부터의 정보들을 사용자의 프로그램에 옮겨주는 기능을 합니다.

이 문서에서는 gawk의 주요 내장변수들을 사용목적에 따라 구분하고 설명하고자 합니다.

프로그램을 통제하는 내장변수

아래의 것들은 사용자가 값을 바꿈으로써 awk 프로그램의 특정 데이터 처리방식을 조정할 수 있는 내장변수들입니다. gawk에만 해당하는 변수들은 # 표시하였습니다.

변수명설명
CONVFMT이 변수는 숫자를 문자열로 바꿔줍니다. 기본값은 "%.6g"
FIELDWIDTHS #input을 field의 길이로 나눌 때 사용. FS보다 우선순위가 앞선다
FSInput에 대한 필드 구분자. Field Seperator의 약자. 사용자는 FS =" "에서 " "안에 기호를 넣음으로써 필드 구분자를 정의할 수 있다
OFMT #이 변수는 숫자를 문자열로 바꿔줍니다. CONVFMT이전에 사용되던 변수
OFS #output에 대한 필드 구분자. 사용법은 FS와 동일
ORS #output에 대한 레코드 구분자.
RS #Input에 대한 레코드 구분자
SUBSEPsubscript의 seperator
TEXTDOMAIN #awk 수준에서 프로그램을 국제화하기 위해 사용되는 변수. 이 변수는 기본적인 소스 텍스트에 표시된 문자로 텍스트 도메인을 설정합니다

정보를 전달하는 내장변수

다음의 변수들은 사용자의 프로그램에 필요한 정보를 제공하기 위해 특정 성질의 값을 awk에서 자동적으로 설정한 것들입니다.

변수명설명
ARGV배열 안에 포함된 명령행 인자
ARGC존재하는 명령행 인자의 개수 표시
ARGIND현재 파일에서 처리되고 있는 ARGV에 대한 index
ENVIRON다양한 환경값들을 연관있는 배열로 표시
EPRNOgetline으로 redirection하는 동안 에러가 발생했을 때 에러를 표시함
FILENAME현재 작업중인 파일의 이름 표시
FNR입력되는 파일이 여러 개인 경우 현재 처리중인 파일의 NF 표시
NF데이터의 필드 수를 표시 Number of Field
NR데이터의 레코드 수를 표시 Number of Record
PROCINFO#실행되고 있는 awk 프로그램에 대한 정보를 제공
RLENGTHmatch 함수에 의해 매치된 하부문자열의 길이 표시
RSTARTmatch 함수에 의해 매치된 하부문자열의 시작지점 표시
RT#RS에 의해 구별된 레코드 Input 텍스트를 표시

ARGV, ARGC 사용하기

ARGV는 awk 프로그램에서 자주 쓰이는 내장변수입니다. ARGV는 사용자가 명령행에 입력한 인자를 인풋으로 받아 프로그램 내에서 처리할 수 있도록 도와주기 때문에 매우 유용합니다.

ARGV의 사용법을 익히기 위해 잠시 예를 살펴보겠습니다.

BEGIN {
        print ARGV[1];
}

위와 같은 프로그램을 print.awk라고 저장하고 실행시키면 아래와 같은 결과가 나옵니다

$ gawk -f print.awk

이처럼 아무런 값이 출력되지 않는 이유는 내장변수 ARGV[1]에 해당하는 입력값을 넣지 않았기 때문입니다. 다음과 같이 해보겠습니다

$ gawk -f print.awk Hello
Hello

Hello라는 글자가 출력되었습니다. 이 경우에는 내장변수 ARGV[1]에 입력값 Hello를 넣어줬기 때문입니다. 이상에서 우리는 ARGV[1]가 명령행에서 명령어 다음 칸의 입력값을 가리키고 있음을 알 수 있습니다. 마찬가지로 ARGV[2]는 명령어로부터 다음다음칸의 입력값을 가리킬 것이라 생각할 수 있습니다. ARGV[1]과 ARGV[2]를 사용하는 프로그램을 만들어 보겠습니다.

BEGIN {
        print ARGV[1], ARGV[2];
}

이 프로그램을 print2.awk라 저장하고 아래와 같이 실행시키면

$ gawk -f print2.awk Hello World
Hello World

가 나타납니다. 내장 변수 ARGV[i]는 이처럼 명령어를 기준으로 i번째에 해당하는 명령행 인자를 가리킵니다.

ARGC는 명령행 인자의 총 개수를 표시합니다. 이 변수를 ARGV와 같이 활용하면 조건문을 이용하여 루프 프로그램을 만드는 것이 가능합니다. 예제를 살펴보겠습니다.

 BEGIN {
        for (i = 0; i<ARGC; i++) {
                print ARGV[i]
        }
}

위와 같이 입력한 프로그램을 ARGC.awk 라 저장하고 다음과 같이 실행해봅시다.

 $ gawk -f ARGC.awk Hello My World
> Hello
  My
  Wolrd

ARGC를 이용한 루프 프로그램의 장점은 명령행 인자를 몇 개 입력했는지와 상관없이 일반화된 루프 처리가 가능하다는 것입니다.


출처 : ko.wikibooks.org


Trackback 0 Comment 0