분류 기타

"숫자 맞추기" 게임을 코딩하여 awk 배우기

컨텐츠 정보

  • 조회 108 (작성일 )

본문

프로그래밍 언어는 많은 공통 특성을 공유하는 경향이 있습니다. 새로운 언어를 배우는 좋은 방법 중 하나는 친숙한 프로그램을 만드는 것입니다. 이 기사에서는 친숙한 개념을 보여주기 위해 awk를 사용하여 "숫자 맞추기" 게임을 만들 것입니다.


새로운 프로그래밍 언어를 배울 때 대부분의 프로그래밍 언어가 공통적으로 가지고 있는 것에 초점을 맞추는 것이 좋습니다.


  • 변수 – 정보가 저장되는 장소
  • 표현식 – 사물을 계산하는 방법
  • 명령문 – 상태 변경이 프로그램에서 표현되는 수단

이러한 개념은 대부분의 프로그래밍 언어의 기초입니다.


이러한 개념을 이해하고 나면 나머지 개념을 파악하기 시작할 수 있습니다. 

예를 들어, 대부분의 언어에는 설계에 의해 지원되는 "일을 하는 방법"이 있으며 이러한 방법은 프로그램마다 상당히 다를 수 있습니다. 

이러한 방법에는 모듈성(관련 기능을 함께 그룹화), 선언적 대 명령, 객체 지향, 저수준 및 고수준 구문 기능 등이 포함됩니다. 

많은 프로그래머에게 친숙한 예는 "의식", 즉 문제를 해결하기 전에 장면을 설정하는 데 필요한 작업량입니다. 

Java 프로그래밍 언어에는 클래스 내에서 모든 코드를 정의해야 하는 설계로 인해 중요한 의식 요구 사항이 있다고 합니다.


그러나 기본으로 돌아가십시오. 프로그래밍 언어는 일반적으로 유사점을 공유합니다. 

하나의 프로그래밍 언어를 알고 나면 다른 언어의 기본을 배우는 것으로 시작하여 새로운 언어의 차이점을 이해하십시오.


진행하는 좋은 방법은 기본 테스트 프로그램 세트를 만드는 것입니다. 이를 손에 넣은 상태에서 학습은 이러한 유사점에서 시작됩니다.


사용할 수 있는 테스트 프로그램 중 하나는 "숫자 추측" 프로그램입니다. 컴퓨터는 1에서 100 사이의 숫자를 선택하고 숫자를 추측하도록 요청합니다. 프로그램은 정확한 추측을 할 때까지 반복합니다.


"숫자 추측" 프로그램은 프로그래밍 언어에서 여러 개념을 연습합니다.


  • Variables 
  • Input 
  • Output 
  • Conditional 
  • evaluation 
  • Loops

그것은 새로운 프로그래밍 언어를 배우기 위한 훌륭한 실용적인 실험입니다.


참고: 이 기사는 Julia에서 이 접근 방식을 사용하는 방법에 대한 Moshe Zadka의 기사와 Bash에서 이를 수행하는 것에 대한 Jim Hall의 기사를 수정한 것입니다.


awk의 숫자를 맞춰보세요 


Awk 프로그램으로 "숫자 맞추기" 게임을 작성해 봅시다.


Awk는 동적으로 유형이 지정되고 데이터 변환을 지향하는 스크립팅 언어이며 대화식 사용에 대한 놀라운 지원을 제공합니다. 

Awk는 원래 Unix 운영 체제의 일부로 1970년대부터 존재해 왔습니다. Awk를 모르지만 스프레드시트를 사랑한다면 이것은 신호입니다... 

가서 Awk를 배우십시오!


"숫자 맞추기" 게임 버전을 작성하여 Awk 탐색을 시작할 수 있습니다.


다음은 내 구현입니다(특정 기능 중 일부를 검토할 수 있도록 줄 번호 포함).


     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9        if (guess < randomNumber) {
    10            printf "too low, try again:"
    11        } else if (guess > randomNumber) {
    12            printf "too high, try again:"
    13        } else {
    14            printf "that's right\n"
    15            exit
    16        }
    17    } 



Awk 제어 구조와 C 또는 Java의 구조 간에 유사점을 즉시 알 수 있지만 Python과는 다릅니다. if-then-else 또는 while과 같은 명령문에서 then, else 및 while 부분은 { 및 }로 묶인 명령문 또는 명령문 그룹을 취합니다. 그러나 처음부터 이해해야 하는 AWk에는 한 가지 큰 차이점이 있습니다.


설계상 Awk는 데이터 파이프라인을 중심으로 구축되었습니다.


대부분의 Awk 프로그램은 한 줄의 입력을 받고 데이터로 작업을 수행하고 출력에 쓰는 코드 조각입니다. 이러한 변환 파이프라인의 필요성을 인식하여 Awk는 기본적으로 모든 변환 배관을 제공합니다. 위의 프로그램을 통해 다음과 같은 기본적인 질문을 통해 이를 살펴보겠습니다. '콘솔에서 데이터 읽기' 구조는 어디에 있습니까?


이에 대한 대답은 – 내장되어 있습니다. 특히 7-17행은 Awk에게 읽은 각 행에 대해 무엇을 해야 하는지 알려줍니다. 그 컨텍스트를 감안할 때 1-6행이 읽기 전에 실행되는 것을 보는 것은 매우 쉽습니다.


더 구체적으로 말하면, 1행의 BEGIN 키워드는 일종의 "패턴"이며, 이 경우 Awk에게 데이터를 읽기 전에 { … }에서 BEGIN 다음에 오는 것을 실행해야 함을 나타냅니다. 이 프로그램에서 사용되지 않는 유사한 END 키워드는 Awk에게 모든 것을 읽었을 때 무엇을 해야 하는지를 나타냅니다.


7 - 17행으로 돌아가서 유사한 코드 블록을 생성하는 것을 볼 수 있지만 앞에 키워드가 없습니다. Awk의 { 앞에는 일치하는 항목이 없기 때문에 이 줄을 수신된 모든 입력 줄에 적용합니다. 입력의 각 줄은 사용자가 추측으로 입력합니다.


실행되는 코드를 살펴보자. 첫째, 입력을 읽기 전에 발생하는 프리앰블입니다.


2행에서 난수 생성기를 숫자 42로 초기화합니다(인수를 제공하지 않으면 시스템 시계가 사용됨). 42? Of course 42. 3행은 1에서 100 사이의 난수를 계산하고 4행은 디버깅 목적으로 그 숫자를 출력합니다. 5행은 사용자가 숫자를 추측하도록 합니다. 이 줄은 print가 아닌 printf를 사용합니다. C와 마찬가지로 printf의 첫 번째 인수는 출력 형식을 지정하는 데 사용되는 템플릿입니다.


이제 사용자는 프로그램이 입력을 기대한다는 것을 알았으므로 콘솔에 추측을 입력할 수 있습니다. Awk는 앞서 언급한 것처럼 7-17행의 코드에 이 추측을 제공합니다. 18행은 입력 레코드를 정수로 변환합니다. $0은 전체 입력 레코드를 나타내는 반면 $1은 입력 레코드의 첫 번째 필드를 나타내고 $2는 두 번째 필드를 나타내는 식입니다. 예, Awk는 사전 정의된 구분 기호를 사용하여 입력 라인을 구성 필드로 분할합니다. 기본적으로 공백은 공백입니다. 9-15행은 추측값을 난수와 비교하여 적절한 응답을 출력합니다. 추측이 맞다면 라인 15는 입력 라인 처리 파이프라인에서 너무 일찍 종료됩니다.


Simple! 


특정 입력 라인 구성에 반응하고 데이터로 작업을 수행하는 코드 조각으로 Awk 프로그램의 비정상적인 구조를 감안할 때 필터링 부분이 어떻게 작동하는지 보기 위해 대체 구조를 살펴보겠습니다.


     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    int($0) < randomNumber {
     8        printf "too low, try again: "
     9    }
    10    int($0) > randomNumber {
    11        printf "too high, try again: "
    12    }
    13    int($0) == randomNumber {
    14        printf "that's right\n"
    15        exit
    16    } 


1~6행은 변경되지 않았습니다. 그러나 이제 7~9행은 행의 정수 값이 난수보다 작을 때 실행되는 코드이고, 10~12행은 행의 정수 값이 난수보다 클 때 실행되는 코드입니다. , 그리고 13-16행은 두 항목이 일치할 때 실행되는 코드입니다.


이것은 "멋지지만 이상하게" 보일 것입니다. 예를 들어 int($0)를 반복적으로 계산하는 이유는 무엇입니까? 그리고 확실히, 그것은 문제를 해결하는 이상한 방법일 것입니다. 그러나 이러한 패턴은 정규식이나 Awk가 지원하는 다른 구조를 사용할 수 있기 때문에 조건부 처리를 분리하는 정말 훌륭한 방법이 될 수 있습니다.


완전성을 위해 이러한 패턴을 사용하여 특정 상황에만 적용되는 일반적인 계산과 구분할 수 있습니다. 다음은 설명할 세 번째 버전입니다.


     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9    }
    10    guess < randomNumber {
    11        printf "too low, try again: "
    12    }
    13    guess > randomNumber {
    14        printf "too high, try again: "
    15    }
    16    guess == randomNumber {
    17        printf "that's right\n"
    18        exit
    19    } 


입력 값이 무엇이든 정수로 변환해야 한다는 점을 인식하고 이를 수행하기 위해 라인 7 – 9를 만들었습니다. 이제 3개의 라인 그룹인 10 – 12, 13 – 15 및 16 – 19는 매번 입력 라인을 변환하는 대신 이미 정의된 변수 추측을 참조합니다.


우리가 배우고 싶었던 것들의 목록으로 돌아가자:


  • variables – 예, Awk에는 변수가 있습니다. 입력 데이터가 문자열로 제공되지만 필요할 때 숫자 값으로 변환될 수 있다고 추론할 수 있습니다.
  • input – Awk는 읽기에 대한 "데이터 변환 파이프라인" 접근 방식을 통해 입력을 보냅니다.
  • output – 우리는 Awk의 print 및 printf 프로시저를 사용하여 출력할 내용을 작성했습니다.
  • conditional evaluation – Awk의 if-then-else 및 특정 입력 라인 구성에 응답하는 입력 필터에 대해 배웠습니다.
  • loops – 허, 상상해보세요! Awk가 취하는 "데이터 변환 파이프라인" 접근 방식 덕분에 여기서 다시 한 번 루프가 필요하지 않았습니다. 루프는 "그냥 발생합니다." 사용자는 파일 끝 신호를 Awk(Linux 터미널 창을 사용하는 경우 CTRL-D)에 전송하여 파이프라인을 조기에 종료할 수 있습니다.


입력을 처리하기 위해 루프가 필요하지 않다는 중요성을 고려해 볼 가치가 있습니다. Awk가 오랫동안 실행 가능하게 남아 있는 한 가지 이유는 Awk 프로그램이 컴팩트하고, 컴팩트한 이유 중 하나는 콘솔이나 파일에서 읽는 데 필요한 상용구가 없기 때문입니다.


프로그램을 실행해 보겠습니다.


awk -f guess.awk
random number is 25
guess a number between 1 and 10050
too high, try again: 30
too high, try again: 10
too low, try again: 25
that's right
$
 


우리가 다루지 않은 한 가지는 댓글이었습니다. Awk 주석은 #으로 시작하여 줄 끝으로 끝납니다.


마무리 


Awk는 엄청나게 강력하며 이 "숫자 맞추기" 게임은 시작하기에 좋은 방법입니다. 하지만 그것이 여행의 끝이 되어서는 안 됩니다. Awk의 확장 버전인 Awk와 Gawk(GNU Awk)의 역사에 대해 읽을 수 있으며 아마도 Linux를 실행하는 경우 컴퓨터에 있을 수도 있고 초기 개발자로부터 원본에 대한 모든 내용을 읽을 수 있습니다.


출처 : https://opensource.com/article/21/1/learn-awk



awk