awk 사용법

8537 단어 awktech
문자열이나 파일에서 의도대로 텍스트를 조작하거나 추출할 수 있습니다.
'정규 표현식' 을 사용하면 문자열을 간단하게 필터할 수 있습니다.
Unix/Linuxawk도 이러한 작업을 수행할 수 있는 명령입니다.awk는 프로그래밍 언어로서 우리에게 다양한 조작을 제공할 수 있다.
awk에는 다음과 같은 문법이 있습니다.(file을 받은 경우에만)
awk /pattern/ { actions }  filenames  
pattern은 각 줄의 패턴이 일치하고 action은 각 줄에 대해 어떤 처리(표시, 변수의 덧셈 등)를 적용하는가이다.

우선


파일 내용 표시

hoge.txt.
hello
world
hello2
helle
다음 명령awk을 사용하여 파일의 내용을 표시할 수 있습니다.
awk '{print}' hoge.txt 

파일에서 문자열이 포함된 행 추출


예를 들어 hoge.txt에서 포함hello을 추출한 줄은 다음과 같다.
awk '/hello/{print}' hoge.txt
결과
hello
hello2
/hello/의 섹션에서는 추출할 문자열 모드를 지정하고 /에서 문자 패턴을 둘러싸서 지정합니다.
그러므로
awk '{print}' hoge.txt 
도 다음과 같이 설명할 수 있다.//는 추출할 문자열 모드가 없음을 나타냅니다.
awk '//{print}' hoge.txt 

와일드카드

* 어댑터로 작용한다.이 경우 h는 0회 이상을 포함하고 2회를 포함하는 줄을 표시합니다.
awk '/h*2/{print}' hoge.txt
결과
hello2
.도 유사하게 사용할 수 있다.이 경우, 어느 순간 h로 시작하여, 중간에 l을 포함하는 줄을 표시합니다.
awk '/h.l/' hoge.txt
결과
hello
hello2
helle
행의 경우hogefugahogefuga 주의 사항
awk '/h*a/' hoge.txt
를 실행할 때 가장 긴 문자열 모드hogefuga를 되돌려줍니다 /h*a.

문자가 포함된 여러 줄 추출

hogefugahogefuga 또는 l를 포함하는 줄을 추출하고 싶은 경우.
awk '/[lw]/' hoge.txt
결과
hello
world
hello2
helle
또한 w 또는 l 이후w에 도착한 줄을 추출한 경우 다음과 같다.
awk '/[lo]2/' hoge.txt
결과
hello2

범위를 지정하여 행 추출하기

  • [0-9]: 숫자
  • [a-z]: 알파벳 소문자
  • [A-Z]: 대문자
  • [a-zA-Z]: 자모
  • [a-zA-Z0-9]: 알파벳 또는 숫자
  • 첫 번째 문자열 일치

    2부터 시작하는 줄입니다.
    awk '/^h/' hoge.txt
    
    결과
    hello
    hello2
    helle
    

    끝 문자열 일치

    h로 끝나는 줄을 추출합니다.
    awk '/d$/' hoge.txt
    // awk '/ld$/' hoge.txt
    
    결과
    world
    

    파일에서 추출


    테스트 파일
    No	Name	Math Eng
    1	Alice	90	80
    2	Bob	60	100
    3 	Carl	80	40
    

    전체 열에 공백 없음


    awk '//{print $1 $2 $3}' score.csv 
    
    결과
    NoNameMath
    1Alice90
    2Bob60
    3Carl80
    

    전체 열 디스플레이 공간


    awk '//{print $1, $2, $3}' score.csv 
    
    결과
    No Name Math
    1 Alice 90
    2 Bob 60
    3 Carl 80
    

    printf에서format


    awk '//{printf "%d-%s\n",$1, $2}' score.csv 
    
    결과
    0-Name
    1-Alice
    2-Bob
    3-Carl
    

    비교 연산자

    d의 구상은 다음과 같다.
    No      Item_Name               Quantity        Price
    1       Mango                    45           $3.45
    2       Apple                     25           $2.45	**
    3       Pineapple                 5            $4.45	**
    4       Tomato                   25           $3.45	**
    5       Onion                     15           $1.45	**
    6       Banana                    30           $3.45	**
    
    비교 연산자를 사용하는syntax는 다음과 같다.
    expression { actions; }
    
    expression의 부분에서 기대하는 공식을 묘사한다.

    Quantity 는 10 이하의 줄만 표시합니다.


    awk '$3 < 10 {print $0}'
    
    결과
    3       Pineapple                 5            $4.45
    

    Quantity 는 20 개 이상의 행에 many 를 추가합니다.


    awk '$3 >= 20 {printf "%s\t%s\n", $0, "many";} $3 < 20 {print $0; }' food.csv
    
    결과
    No      Item_Name               Quantity        Price	many
    1       Mango                    45           $3.45	many
    2       Apple                     25           $2.45	many
    3       Pineapple                 5            $4.45
    4       Tomato                   25           $3.45	many
    5       Onion                     15           $1.45
    6       Banana                    30           $3.45	many
    

    Item 이름이 A로 시작하는 행 추출


    awk '($2 ~ /^A/) {printf "%s\n", $0}' food.csv
    
    결과
    2       Apple                     25           $2.45
    

    Item 이름은 A로 시작하고 Quantity는 20개 이상의 행을 추출합니다.


    awk '($2 ~ /^A/) && ($3 >=20)  {printf "%s\n", $0}' food.csv
    
    결과
    2       Apple                     25           $2.45
    
    30가지 상황을 시험해 보세요.
    awk '($2 ~ /^A/) && ($3 >=30)  {printf "%s\n", $0}' food.csv
    
    결과 없음

    next 명령을 통해 실행 효율을 높이다


    Quantity 가 20개 이상의 행에 many 를 추가하는 위치에 설명된 명령에 문제가 있습니다.
    awk '$3 >= 20 {printf "%s\t%s\n", $0, "many";} $3 < 20 {print $0; }' food.csv
    
    3열의 값이 20 이상으로 확인된 후에도 이후식food.csv을 실행한다.
    따라서 $3 < 20 {print $0; } 명령을 사용합니다.
    awk '$3 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $3 > 20 { print $0 ;}' food.csv
    

    Begin과 End.


    키워드nextBEGIN를 사용하면 awk 명령을 실행하는 것과 일치하는 동작을 수행할 수 있습니다.
    BEGIN 모드에서는 입력 줄을 읽기 전에 BEGIN이 지정한 동작을 한 번만 수행합니다.
    END 모드에서는 Awk가 실제로 종료되기 전에 END에서 지정한 작업을 수행합니다.
    다음 명령은 사용 예입니다.END의 Quantity 행에서 20이 넘는 행 수를 계산합니다.
    awk 'BEGIN { printf "Count: " } $3 >= 20 {n+=1} END {print n}' food.csv
    
    결과
    Count: 5
    
    END 제외
    awk '$3 >= 20 {n+=1} {print n}' food.csv
    
    결과
    1
    2
    3
    3
    4
    4
    5
    

    기타


    awk 'BEGIN {print "hello world"}'
    
    도 계산할 수 있다.
    awk 'BEGIN {print 1*2*100, 5/2}' // 200 , 2.5
    

    삽입식 변수

    food.csv에 포함된 변수가 있습니다.
  • FILENAME : current input file name( do not change variable name)
  • FR : number of the current input line (that is input line 1, 2, 3… so on, do not change variable name)
  • NF : number of fields in current input line (do not change variable name)
  • OFS: output field separator (출력할 때의 열 구분자)
  • FS: input field separator(입력 시 열의 구분 문자)
  • ORS: output record separator (출력할 때 줄의 구분자 문자)
  • RS: input record separator (입력할 때 줄의 구분자 문자)
  • 참조: https://www.tecmint.com/awk-built-in-variables-examples/
    awk '{print NF}' food.csv
    
    결과: 각 행의 열 수를 표시합니다.
    4
    4
    4
    4
    4
    4
    4
    

    참고 자료

  • https://www.tecmint.com/category/awk-command/
  • https://qiita.com/muijp/items/02ddff566231bdb04a75
  • 좋은 웹페이지 즐겨찾기