Awk - 유용한 작은 언어

Awk는 텍스트 처리에 사용되는 작지만 유능한 프로그래밍 언어입니다. Bell Labs의 Aho, Weinberger, Kerninghan이 개발했습니다.

awk에 멋진 소개를 했습니다.


Awk는 입력 파일을 일련의 라인으로 스캔하고 각 라인을 필드로 분할합니다. 필드 구분 기호는 일반적으로 공백이지만 모든 문자로 사용자 지정할 수 있습니다.
awk 프로그램은 일련의 패턴-동작 쌍입니다. 즉, 각 라인에 대해 패턴과 일치하는지 확인하고 일치하는 경우 해당 라인에서 관련 동작을 수행합니다. Awk는 대화식으로 사용하거나 저장된 프로그램을 실행하는 데 사용할 수 있습니다.

다음은 Awk가 Python과 유사한 의사 코드로 작성된 것입니다.

initialize() # Initializes variables in BEGIN block
for line in input_lines: # Awk divides file / input into a list of lines
    for condition, action in conditions: # A program is a list of condition-action pairs
        if condition(line): #match line against condition
            action() #perform action on match 


다음은 Awk의 일부 작은 스니펫입니다.

1. 헬로월드!



프로그램을 인라인으로 또는 파일을 통해 실행할 수 있습니다awk.

awk 'BEGIN{ print "Hello, World!"}'


또는 이것을 파일에 저장할 수 있습니다hello.awk.

BEGIN{ print "Hello, World!"}


그런 다음 awk -f hello.awk로 실행하십시오.

2. CSV 읽기 및 특정 컬럼 출력



이제 유용한 일을 해봅시다! Los Angeles시의 우편번호별 2010년 인구 조사 데이터인 이 파일csv을 다운로드하십시오.

csv에서 처음 3줄을 읽습니다. head -3 2010_Census_Populations_by_Zip_Code.csv
Zip Code,Total Population,Median Age,Total Males,Total Females,Total Households,Average Household Size
91371,1,73.5,0,1,1,1
90001,57110,26.6,28468,28642,12971,4.4

awk -F, '{print $2}' 2010_Census_Populations_by_Zip_Code.csv를 사용하여 합계 열만 인쇄합니다.
-F,는 CSV 파일에서 필드를 가져오기 위해 쉼표로 분할해야 하므로 필드 구분 기호를 쉼표로 설정합니다. $n를 사용하면 n번째 열의 값을 사용할 수 있습니다.

3. 일부 통계 계산



Awk는 변수와 함수의 사용을 허용합니다. 도시 전체의 총인구를 계산하여 어떻게 사용하는지 알아보자.

# total.awk
{s += $2}
END {print "Total population:", s}


변수는 기본적으로 0으로 초기화됩니다. 여기서는 변수s를 사용하여 합계를 저장합니다.

이 스크립트를 awk -F, -f total.awk 2010_Census_Populations_by_Zip_Code.csv로 실행하면 다음과 같은 결과가 나타납니다. Total population: 10603988

특수 변수 및 내장 함수



Awk는 프로그램을 더 간결하게 만들기 위해 몇 가지 특수 변수와 함수를 사용합니다.

  • NF : 라인의 필드 수

  • NR : 줄 번호

  • $0 : 전체 입력 라인

  • 길이: 문자열의 문자 수 제공

  • 이제 전체 인구를 전체 가구로 나눈 평균 가구 크기를 계산합니다. 관심 있는 열은 $2와 $6입니다.
    우리는 또한 우편번호당 평균 인구를 원합니다. 우리의 스크립트:

    # stats.awk
    { s += $2; h += $6;}
    END {print "Total population:", s, "\nTotal households:", h, "\nAverage household size:", s/h, "\nAverage population per zip code:", s/NR}
    

    NR는 총 줄 수를 알려줍니다. 그러나 우리는 헤더 라인을 원하지 않습니다. tail 명령을 사용하여 첫 번째 줄을 tail -n +2 로 건너뛸 수 있습니다. 실행tail -n +2 2010_Census_Populations_by_Zip_Code.csv | awk -F, -f total.awk은 다음을 제공합니다.

    Total population: 10603988
    Total households: 3497698
    Average household size: 3.0317
    Average population per zip code: 33241.3
    


    4. 패턴 매칭



    우리는 지금까지 awk로 몇 가지 유용한 작업을 수행했지만 가장 큰 강점인 패턴 일치를 무시했습니다. 필드 값, 정규식, 줄 번호를 기반으로 일치시킬 수 있습니다.
  • 두 번째 줄마다 인쇄: NR%2 == 0 {print $0} . 여기서 $0은 전체 라인을 나타냅니다.
  • 인구가 > 100,000인 모든 우편번호 인쇄: $2 > 100000 {print $1}
  • 인구 > 10,000 및 평균 가구 규모 > 4: $2 > 10000 && $7 > 4 { print $1}인 모든 우편번호를 인쇄하십시오. 논리적 and 및 or을 각각 나타내는 &&||를 사용하여 조건을 결합할 수 있습니다.

  • 추가 읽기



    Awk에는 더 많은 것이 있습니다. 다음은 몇 가지 참고 자료입니다.
  • Awk 학습을 위한 최고의 리소스는 같은 트리오가 작성한 The AWK programming language입니다. 이 책은 일반적인 프로그래밍 언어 자습서를 넘어 관계형 데이터베이스, 파서, 인터프리터 등과 같은 다목적 시스템을 구축하기 위해 Awk 초능력을 사용하는 방법을 알려줍니다.
  • GNU Awk Manual for Effective Awk Programming은 완전한 참조입니다.
  • 좋은 웹페이지 즐겨찾기