반응형

     정보

    • 업무명     : 리눅스에서 텍스트 처리를 위한 Awk 사용법

    • 작성자     : 이상호

    • 작성일     : 2020-02-09

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

    • Awk는 리눅스 (Linux)에서 텍스트 처리를 위한 프로그래밍 언어입니다. 표준 입력 (stdin) 또는 하나 이상의 파일에서 ​데이터를 가져올 수 있습니다.

    • 또한 사용자 정의 함수 및 동적 정규 표현식과 같은 고급 기능을 지원하며 리눅스의 강력한 프로그래밍 도구입니다. 명령 행에서 사용될 뿐만 아니라 스크립트로 사용합니다.

    • 그 밖에 Awk에는 배열, 함수 등과 같은 많은 내장 함수가 내포되어 있습니다. 무엇보다도 C 언어와 동일하며 유연성은 가장 큰 장점입니다.

    • 오늘은 리눅스 (Linux)에서 일반적으로 사용되는 명령어로서 텍스트 처리하기 위한 "Awk 사용법"을 소개해 드리고자 합니다.

     

     

    [특징]

    • 리눅스 (Linux)에서 효율적인 텍스트 처리를 위해서 Awk 학습이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

     

    [기능]

    • 명령어 형식

    • 스크립트

    • 내장 함수

    • 외부 변수 전달

    • 연산자

    • 입력 및 출력

    • 파일 열기/닫기

    • 순환 구조

    • 배열

    • 내장 기능

     

    [활용 자료]

    • 없음

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 없음

     

    [사용 OS]

    • Linux (CentOS v7.0)

    • VMware Workstation Pro v15.5

     

    [사용 언어]

    • Shell Script (bash)

    • Awk

     

     내용

    [명령어 형식]

    • -F fs : fs는 입력 분리 문자를 지정하고 fs는 문자열 또는 정규식 일 수 있습니다.

    • -v var=value : 사용자 정의 변수를 할당하고 외부 변수를 awk에 전달

    • -F scriptfile : 스크립트 파일에서 awk 명령 읽기

     

    awk [옵션] '스크립트' var=value 파일 
    awk [옵션] -F fs scriptfile var=value 파일 

     

    [스크립트]

    • 모드

      • 정규식 : 와일드 카드 (*)를 사용하여 확장된 형태

      • 관계식 : 연산자를 사용하여 연산을 수행하고 문자열 또는 숫자 비교 테스트 가능

      • 패턴 일치 표현식 : 연산자 사용 ~(일치) 및 ~! (불일치)

      • BEGIN 블록, pattern 블록, END 블록

     

    • 조작

      • 연산은 하나 이상의 명령과 함수 및 식으로 구성되며 줄 바꿈 또는 세미콜론으로 구분된다.

      • 주요 부분은 변수 또는 배열 할당, 출력 명령, 내장 함수 및 제어 흐름문입니다.

     

    • 형식

      • 일반적으로 "BEGIN, pattern, END"와 같이 3 부분으로 구성되며 형식은 다음과 같습니다.

    awk  'BEGIN {commands} pattern {commands} END {commands}' 파일 이름
    
    awk  'BEGIN {i = 0} {i++} END {print i}'  파일 이름  
    awk  "BEGIN {i = 0} {i++} END {print i}"  파일 이름

     

    • 실행 프로세스

      • 1 단계 : "BEGIN {commands}" 블록에서 실행

        • BEGIN문 블록 : awk가 입력 및 출력 스트림에서 행을 읽기 시작하고 BEGIN문 블록에서 변수 초기화, 출력 테이블 헤더 인쇄 등과 같은 조작을 수행하기 전에 실행

      • 2 단계 : 파일 또는 표준 입력에서 1줄을 읽은 후 "pattern {commands}" 블록을 실행함. 모든 파일을 읽을 때까지 파일을 1줄씩 스캔하여 첫번째 줄에서 마지막 줄까지 프로세스를 반복함.

        • pattern 명령문 블록 : pattern 명령문 블록의 공통 명령이 가장 중요한 부분이며 옵션입니다. pattern 블록이 제공되지 않으면 기본적으로 {print}가 실행됨.

        • 즉 모든 행 읽기가 출력됨. { } 루프 본문과 유사하게 파일의 각 행을 반복하며 일반적으로 변수 초기화 명령문은 BEGIN 명령문 블록에 배치되고 출력 결과와 같은 명령문은 END문 블록에 배치됨.

      • 3 단계 : 입력 스트림 끝까지 읽을 때 "END {command}" 블록을 실행함.

        • END 블록은 상기 입력 스트림으로부터 판독하고 상기 행은 이러한 모든 라인의 출력과 같이 결과 등의 집계 정보를 END 블록에서 수행됨.

     

    [내장 함수]

    • $n : 현재 레코드의 n 번째 필드 (예 : 첫 번째 필드의 경우 n은 1이고 두 번째 필드의 경우 n은 2입니다).

    • $0 : 이 변수는 실행 중 현재 줄의 텍스트 내용을 포함

    • ARGC : 명령 줄 인수의 수

    • ARGIND : 명령 줄에서 현재 파일의 위치 (0부터 계산)

    • ARGV : 명령 줄 인수를 포함하는 배열입

    • CONVFMT : 숫자 변환 형식 (기본값은 % .6g)

    • ENVIRON : 환경 변수의 연관 배열

    • ERRNO : 마지막 시스템 오류에 대한 설명

    • FIELDWIDTHS : 필드 너비 목록 (공백 막대로 구분)

    • FILENAME : 현재 입력 파일의 이름

    • NR : 실행 중 현재 줄 번호에 해당하는 레코드 수

    • FNR : NR과 동일하나 현재 파일을 기준

    • FS : 필드 구분 기호 (기본값은 공백)

    • IGNORECASE : true인 경우 대소 문자를 구분하지 않는 일치가 수행

    • NF : 필드 수를 나타내며 실행 중 현재 필드 수에 해당 (print $NF줄의 마지막 필드를 약속)

    • OFMT : 숫자 출력 형식 (기본값은 % .6g)

    • OFS : 출력 필드 구분 기호 (기본값은 공백)

    • ORS : 출력 레코드 구분 기호 (기본값은 줄 바꿈)

    • RS : 레코드 구분 기호 (기본값은 줄 바꿈)

    • RSTART : 일치 함수와 일치하는 문자열의 첫 번째 위치

    • RLENGTH : 일치 함수와 일치하는 문자열의 길이

    • SUBSEP : 배열 인덱스 구분 기호 (기본값은 34)

     

    [외부 변수 전달]

    • 옵션 -v는 비 표준 입력으로서 awk에 외부 변수를 전달

    echo "===================================="
    VAR=10000
    
    echo | awk -v VARIABLE=${VAR} '{print VARIABLE}'

     

    • 외부 변수를 수신할 내부 변수 정의

    echo "===================================="
    var1="var1"
    var2="var2"
    echo | awk '{print v1,v2}' v1=$var1 v2=$var2

     

    • 입력 파일에서 올 때

    echo "===================================="
    awk '{print v1, v2}' v1=$var1 v2=$var2 Example.txt

     

     

    [연산자]

    • 산술 연산 (+, -, *, /, &, !, ..., ++, -) 

      • 모든 연산은 산술 연산자로 사용되면 피연산자는 자동으로 숫자 값으로 변환되고 숫자가 아닌 모든 값은 0으로 초기화

    • 할당 연산 (=, +=, -=, *=, /=, %=, ...=, **=)

    • 논리 연산자 (||, &&)

    • 관계 연산자 (<, <=, >, >= , !=, ==) 

    • 정규 연산자 (~, ~!)

      • "~"의 경두 정규 표현식과 일치이고 "~!"에서는 불일치  

    echo "===================================="
    awk \
       'BEGIN {
          a = "100testa";
          
          if (a ~ /^100*/) {
             print "ok";
          }
       }'

     

     

    [입력 및 출력]

    • next 명령문

      • 반복문에서 1줄씩 수행하되 "next"가 발생하면 현재 행을 건너 뛰고 다음 명령문은 수행

      • 즉 next 명령문은 일반적으로 여러 줄 병합에 사용

      • 예시 : 행 번호가 홀수인 경우 다음 줄을 수행하며 "print NR, $0"은 미 출력

    echo "===================================="
    awk 'NR%2 == 1 {next} {print NR,$0;}' text.txt

     

     

    • getline 명령문

      • 출력 리디렉션에는 getline 함수가 필요함. 즉 getline은 표준 입력, 파이프 또는 현재 처리중인 파일외에 다른 입력 파일에서 입력을 받음.

      • 입력에서 다음 줄의 내용을 가져오고 NF, NR 및 FNR과 같은 내장 변수에 값을 할당함.

      • 레코드가 확보되면 getline 함수는 1을 반환하고 파일 끝에 도달하면 0을 반환하며 파일을 열지 못하는 등의 오류가 발생하면 -1을 반환함. 

     

    [파일 열기/닫기]

    • 파일 열기 : open("filename")

    • 파일 닫기 : close("filename")

    • 파일로 출력을 파일로 리디렉션

    echo "===================================="
    echo | awk '{printf("hello word") > "datafile"}'
    
    cat datafile
    echo

     

     

    [순환 구조]

    • for문

    for (변수 in 배열) {
    	설명
    } 
     
    for (초기값; 조건; 증가) {
    	설명
    }

     

    • while문

    while (조건) {
    	설명
    }

     

    • do while문

    do {
    	설명
    } while (조건)

     

    • 기타

      • break : 반복문 종료

      • continue : 다음 차례로 이동

      • next : 다음 입력줄 읽음

      • exit : end 이동 또는 end가 없을 경우 메인 프로그램 종료

     

    [배열]

    • awk 배열은 연관 배열이라고 함.

    • 또한 미리 선언할 필요가 없고 배열 요소는 0 또는 빈 문자열로 초기화됨.

    echo "===================================="
    awk \
       'BEGIN { 
          Array[1] = "sun"  
          Array[2] = "kai" 
          Array["first"] = "www"
          Array["last"] = "name"
          Array["birth"] = "1987"
             
          info = "it is a test"; 
          lens = split(info, tA, " "); 
    
          print "======== ta[item] ========="
          for (item in tA) {
             print tA[item];
          } 
            
          print "======== ta[i] ========="
          for (i = 1; i <= lens; i++) {
              print tA[i];
          } 
    
          print "======== length ========="
          print length(tA[lens]);
    
    
       } {
          print "======= item in array ========";
          for (item in Array) {
             print Array[item];
          };
          
          print "======= print in i++ ========";
          for (i = 1; i <= length(Array); i++) {
             print Array[i];
          };
       }'

     

     

    • 배열의 길이 

    echo "===================================="
    awk \
       'BEGIN { 
          info = "테스트입니다"; 
       
          # split 함수를 사용하여 배열 길이를 얻습니다 
          lens = split(info, tA, "");
    
          # length 함수를 사용하여 어레이의 길이를 얻습니다
          print length(tA), lens;
       }'

     

     

    • 배열 확인

      • for 반복문에서 연관 배열로서 미 정렬

      • 배열 인덱스는 1부터 시작

     

    • 키값이 존재 확인

      • if 문을 사용하여 키값의 존재여부 확인

    echo "===================================="
    awk \
       'BEGIN {
    
          tB["a"] = "a1"; 
          tB["b"] = "b1"; 
    
          if ("c" in tB) { 
             print "ok";
          };
    
          for(k in tB){
             print k, tB[k]; 
          }
       }'

     

     

    • 삭제

      • 배열 키에 해당하는 시퀀스 값에 따라 삭제 가능

    echo "===================================="
    awk \
       'BEGIN {
    
          tB["a"] = "a1"; 
          tB["b"] = "b1"; 
            
          delete tB["a"];
    
          for(k in tB) { 
             print k, tB[k]; 
          }
    
       }'

     

     

    • 2차원 (다차원 배열)

      • awk는 다차원 배열을 미 지원하나 논리적인 접근 방법이 제시

      • 예시

    echo "===================================="
    awk \
       'BEGIN {
    
          for (i = 1; i <= 9; i++) {
             for (j = 1; j <= 9; j++) {
          
                tarr[i, j] = i * j;  
                
                # print i, "*", j, "=", tarr[i, j];  
             } 
          } 
       }'
    
    awk \
       'BEGIN {
          for (i = 1; i <= 9; i++) {  
             for (j = 1; j <= 9; j++) {  
                        
                tarr[i, j] = i * j; 
             } 
          } 
    
          for (m in tarr) {  
             split(m, tarr2, SUBSEP);  
    
             print tarr2[1], "*", tarr2[2], "=", tarr[m]; 
          } 
       }'

     

     

    [내장 기능]

    • 산술 함수

    함수 설명
    atan(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() 0 <= n < 1인 숫자 n 반환
    srand([expr]) rand 함수의 seed값을 expr로 설정
    expr이 생략된 경우 시간으로 사용

     

    echo "===================================="
    awk \
       'BEGIN {
    
          OFMT = "%.3f";
    
          fs = sin(1); 
          fe = exp(10); 
          fl = log(10); 
          fi = int(3.1415);
    
          print fs, fe, fl, fi; 
       }'
    
    
    awk \
       'BEGIN { 
    
          srand();
          fr = int(100 * rand());
    
          print fr; 
       }'

     

     

    • 문자열 함수

    함수 설명
    gsub( Ere, Repl, [ In ] ) 정규식의 모든 특정 값이 바뀌는 것을 제외하고는 하위 함수와 정확히 동일하게 수행됩니다.
    sub( Ere, Repl, [ In ] ) In 매개 변수로 지정된 문자열에서 Ere 매개 변수로 지정된 확장 정규식의 첫 번째 특정 값을 Repl 매개 변수로 지정된 문자열로 바꿉니다. sub 함수는 교체 횟수를 반환합니다. Repl 매개 변수로 지정된 문자열에 나타나는 앰퍼샌드 (및 기호)는 Ere 매개 변수로 지정된 확장 정규식과 일치하는 In 매개 변수로 지정된 문자열로 대체됩니다. In 매개 변수를 지정하지 않으면 기본값은 전체 레코드 ($ 0 레코드 변수)입니다.
    index( String1, String2 ) String1 매개 변수로 지정된 문자열에서 (String2로 지정된 매개 변수가 표시됨) 위치가 1부터 시작하여 리턴됩니다. String2 매개 변수가 String1 매개 변수에 나타나지 않으면 0이 리턴됩니다.
    length[(String)] String 매개 변수로 지정된 문자열의 길이 (문자)를 리턴합니다. String 매개 변수가 제공되지 않으면 전체 레코드의 길이를 리턴합니다 ($ 0 레코드 변수).
    blength [(String)] String 매개 변수로 지정된 문자열의 길이 (바이트)를 리턴합니다. String 매개 변수가 제공되지 않으면 전체 레코드의 길이를 리턴합니다 ($ 0 레코드 변수).
    substr( String, M, [ N ] ) N 매개 변수로 지정된 문자 수를 가진 부분 문자열을 리턴합니다. 부분 문자열은 String 매개 변수로 지정된 문자열에서 가져오고 해당 문자는 M 매개 변수로 지정된 위치에서 시작합니다. M 매개 변수는 문자열 매개 변수에서 첫 번째 문자로 숫자 1로 지정됩니다. N 매개 변수를 지정하지 않으면 부분 문자열의 길이는 M 매개 변수가 String 매개 변수 끝까지 지정한 길이가됩니다.
    match( String, Ere ) Ere 매개 변수로 지정된 확장 정규식이 표시되는 String 매개 변수로 지정된 문자열의 위치 (문자 형식)를 리턴하거나 Ere 매개 변수가 나타나지 않으면 0을 리턴합니다. RSTART 특수 변수는 리턴 값으로 설정됩니다. RLENGTH 특수 변수는 일치하는 문자열의 길이로 설정되거나 일치하는 것이 없으면 -1 (음수)입니다.
    tolower( String ) String 매개 변수로 지정된 문자열을 리턴합니다. 문자열의 각 대문자는 소문자로 변경됩니다. 대문자와 소문자 매핑은 현재 로캘의 LC_CTYPE 범주로 정의됩니다.
    toupper( String ) String 매개 변수로 지정된 문자열을 리턴합니다. 문자열의 각 소문자는 대문자로 변경됩니다. 대문자와 소문자 매핑은 현재 로캘의 LC_CTYPE 범주로 정의됩니다.
    sprintf(Format, Expr, Expr, . . . )
    Format 매개 변수로 지정된 printf 서브 루틴 형식 문자열에 따라 Expr 매개 변수로 지정된 표현식을 형식화하고 마지막으로 생성 된 문자열을 리턴합니다.

     

    • 시간 함수

    함수 설명
    mktime( YYYY MM dd HH MM ss[ DST]) 시간 형식 생성
    strftime([format [, timestamp]]) 시간 출력을 형식화하고 시간 소인을 시간 문자열의 특정 형식으로 변환하십시오 (아래 표 참조).
    systime() 타임 스탬프를 가져 와서 1970 년 1 월 1 일부터 현재 시간까지의 전체 초 수를 반환합니다 (윤년 제외).

     

    • strftime 날짜 및 시간 형식

    함수 설명
    %a 요일의 약어 (일)
    %A 요일 (일요일)
    %b 월 약어 (10월)
    %B 이달의 전체 이름 (10월)
    %c 현지 날짜 및 시간
    %d 소수점 날짜
    %D 날짜 08/20/99
    %e 날짜, 숫자가 하나 뿐인 경우 공백이 추가됩니다.
    %H 24 시간 형식의 시간 (10 진수)
    %I 12 시간 형식의 시간 (10 진수)
    %j 1 월 1 일부터 연중
    %m 십진수로 된 월
    %M 십진수
    %P 12 시간 표기법 (AM / PM)
    %S 십진수 초
    %U 일주일을 십진수로 표시합니다 (일요일이 시작되는 일요일)
    %w 요일을 10 진수로 표시합니다 (일요일은 0 임).
    %W 연도의 주 단위 (월은 주의 시작)
    %x 현지 날짜 재설정 (08/20/99)
    %X 현지 시간 재설정 (12:00:00)
    %y 두 자리 연도 (99)
    %Y 이번 달
    %Z 시간대 (PDT)
    %% 퍼센트 부호 (%)

     

    echo "===================================="
    awk \
       'BEGIN {
    
          tstamp = mktime("2001 01 01 12 12 12");
          
          print strftime("%c", tstamp);
       }'
    
    awk \
       'BEGIN {
    
          tstamp1 = mktime("2001 01 01 12 12 12");
          tstamp2 = mktime("2001 02 01 0 0 0");
       
          print tstamp2 - tstamp1;
       }'
    
    
    awk \
       'BEGIN {
    
          tstamp1 = mktime("2001 01 01 12 12 12");
          tstamp2 = systime();
    
          print tstamp2 - tstamp1;
       }'

     

     

    • 기타 함수
    함수 설명
    close( Expression ) print 또는 printf 문 또는 getline 함수를 호출하여 열린 파일 또는 파이프를 닫으려면 문자열 값과 동일한 Expression 매개 변수를 사용하십시오. 파일이나 파이프가 성공적으로 닫히면 0을, 그렇지 않으면 0이 아닌 값을 반환합니다. 파일을 작성하고 나중에 같은 프로그램에서 파일을 읽으려면 close 문이 필요합니다.
    system(command ) Command 매개 변수로 지정된 명령을 실행하고 종료 상태를 리턴합니다. 시스템 서브 루틴과 동일합니다.
    Expression | getline [ Variable ] Expression 매개 변수로 지정된 명령의 출력에서 ​​파이프 스트림에서 입력 레코드를 읽고 레코드 값을 Variable 매개 변수로 지정된 변수에 할당합니다. Expression 매개 변수 값이 현재 열려 있지 않은 경우 명령 이름으로 스트림을 만듭니다. 작성된 스트림은 popen 서브 루틴을 호출하는 것과 같습니다.이 경우 Command 매개 변수는 Expression 매개 변수의 값을 가져오고 Mode 매개 변수는 r 인 값으로 설정됩니다. 스트림이 열려 있고 Expression 매개 변수가 동일한 문자열로 평가되는 한 getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. Variable 매개 변수가 지정되지 않은 경우 $ 0 레코드 변수 및 NF 특수 변수는 스트림에서 읽은 레코드로 설정됩니다.
    getline [ Variable ] < Expression Expression 매개 변수로 지정된 파일에서 입력 한 다음 레코드를 읽고 Variable 매개 변수로 지정된 변수를 해당 레코드의 값으로 설정합니다. 스트림이 열려 있고 Expression 매개 변수가 동일한 문자열을 평가하는 한 getline 함수에 대한 각 후속 호출은 다른 레코드를 읽습니다. Variable 매개 변수가 지정되지 않은 경우 $ 0 레코드 변수 및 NF 특수 변수는 스트림에서 읽은 레코드로 설정됩니다.
    getline [ Variable ] Variable 매개 변수로 지정된 변수를 현재 입력 파일에서 읽은 다음 입력 레코드로 설정합니다. Variable 매개 변수를 지정하지 않으면 $ 0 레코드 변수가 레코드 값으로 설정되고 NF, NR 및 FNR 특수 변수도 설정됩니다.

     

    echo "===================================="
    echo -e "모든 파일 읽기"
    
    awk \
       'BEGIN {
          
          while ("cat Test.txt" | getline) {
             
             print $0;
          };
          
          close("Test.txt");
    
       }'
    
    echo -e "\n 1줄마다 파일 읽기"
    
    awk \
       'BEGIN {
       
          while (getline < "Test.txt") {
             
             print $0;
          };
    
          close("Test.txt");
    
       }'
    
    echo -e "\n 파일 입력" 
    
    awk \
       'BEGIN {
          
          print "Enter your name:";
          
          getline name;
          
          print name;
       }'
    
    echo -e "\n 외부 응용 프로그램 호출"
    
    awk \
       'BEGIN {
    
          b = system("ls -al");
          
          print b;
       }'

     

     

    [전체]

    #!/bin/sh
    
    #=============================================================================================== 
    # Routine : Main AWK program
    # 
    # Purpose : Awk Basis Using Liunx
    # 
    # Author : MS. Sang-Ho Lee
    # 
    # Revisions: V1.0 February 23, 2020 First release (MS. Sang-Ho Lee)
    #===============================================================================================
    
    
    echo "===================================="
    VAR=10000
    
    echo | awk -v VARIABLE=${VAR} '{print VARIABLE}'
    
    echo "===================================="
    var1="var1"
    var2="var2"
    echo | awk '{print v1,v2}' v1=$var1 v2=$var2
    
    echo "===================================="
    awk '{print v1, v2}' v1=$var1 v2=$var2 Example.txt
    
    echo "===================================="
    awk \
       'BEGIN {
          a = "100testa";
          
          if (a ~ /^100*/) {
             print "ok";
          }
       }'
    
    
    echo "===================================="
    awk 'NR%2 == 1 {next} {print NR,$0;}' text.txt
    
    echo "===================================="
    echo | awk '{printf("hello word") > "datafile"}'
    
    cat datafile
    echo
    
    echo "===================================="
    awk \
       'BEGIN { 
          Array[1] = "sun"  
          Array[2] = "kai" 
          Array["first"] = "www"
          Array["last"] = "name"
          Array["birth"] = "1987"
             
          info = "it is a test"; 
          lens = split(info, tA, " "); 
    
          print "======== ta[item] ========="
          for (item in tA) {
             print tA[item];
          } 
            
          print "======== ta[i] ========="
          for (i = 1; i <= lens; i++) {
              print tA[i];
          } 
    
          print "======== length ========="
          print length(tA[lens]);
    
    
       } {
          print "======= item in array ========";
          for (item in Array) {
             print Array[item];
          };
    
          print "======= print in i++ ========";
          for (i = 1; i <= length(Array); i++) {
             print Array[i];
          };
       }' 
    
    
    echo "===================================="
    awk \
       'BEGIN { 
          info = "테스트입니다"; 
       
          # split 함수를 사용하여 배열 길이를 얻습니다 
          lens = split(info, tA, "");
    
          # length 함수를 사용하여 어레이의 길이를 얻습니다
          print length(tA), lens;
       }' 
    
    echo "===================================="
    awk \
       'BEGIN {
    
          tB["a"] = "a1"; 
          tB["b"] = "b1"; 
    
          if ("c" in tB) { 
             print "ok";
          };
    
          for(k in tB){
             print k, tB[k]; 
          }
       }'
    
    
    echo "===================================="
    awk \
       'BEGIN {
    
          tB["a"] = "a1"; 
          tB["b"] = "b1"; 
            
          delete tB["a"];
    
          for(k in tB) { 
             print k, tB[k]; 
          }
    
       }' 
    
    echo "===================================="
    awk \
       'BEGIN {
    
          for (i = 1; i <= 9; i++) {
             for (j = 1; j <= 9; j++) {
          
                tarr[i, j] = i * j;  
                
                # print i, "*", j, "=", tarr[i, j];  
             } 
          } 
       }' 
     
    awk \
       'BEGIN {
          for (i = 1; i <= 9; i++) {  
             for (j = 1; j <= 9; j++) {  
                        
                tarr[i, j] = i * j; 
             } 
          } 
    
          for (m in tarr) {  
             split(m, tarr2, SUBSEP);  
    
             print tarr2[1], "*", tarr2[2], "=", tarr[m]; 
          } 
       }' 
    
    echo "===================================="
    awk \
       'BEGIN {
    
          OFMT = "%.3f";
    
          fs = sin(1); 
          fe = exp(10); 
          fl = log(10); 
          fi = int(3.1415);
    
          print fs, fe, fl, fi; 
       }' 
    
    
    awk \
       'BEGIN { 
    
          srand();
          fr = int(100 * rand());
    
          print fr; 
       }'  
    
    echo "===================================="
    awk \
       'BEGIN {
    
          tstamp = mktime("2001 01 01 12 12 12");
          
          print strftime("%c", tstamp);
       }'  
     
    awk \
       'BEGIN {
    
          tstamp1 = mktime("2001 01 01 12 12 12");
          tstamp2 = mktime("2001 02 01 0 0 0");
       
          print tstamp2 - tstamp1;
       }'  
     
    
    awk \
       'BEGIN {
    
          tstamp1 = mktime("2001 01 01 12 12 12");
          tstamp2 = systime();
    
          print tstamp2 - tstamp1;
       }'  
    
    echo "===================================="
    echo -e "모든 파일 읽기"
    
    awk \
       'BEGIN {
          
          while ("cat Test.txt" | getline) {
             
             print $0;
          };
          
          close("Test.txt");
    
       }'  
     
    echo -e "\n 1줄마다 파일 읽기"
          
    awk \
       'BEGIN {
       
          while (getline < "Test.txt") {
             
             print $0;
          };
    
          close("Test.txt");
    
       }'  
    
    echo -e "\n 파일 입력" 
    
    awk \
       'BEGIN {
          
          print "Enter your name:";
          
          getline name;
          
          print name;
       }' 
    
    echo -e "\n 외부 응용 프로그램 호출"
    
    awk \
       'BEGIN {
    
          b = system("ls -al");
          
          print b;
       }'

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기