awk 시리즈 에 정통 (17): awk 불 값, 비교 및 논리 연산

5689 단어
돌아 가기:
  • Linux 시리즈 글
  • Shell 시리즈 글
  • Awk 시리즈 글
  • awk 불 값
    awk 에 서 는 다른 언어 처럼 true, false 와 같은 키 워드 를 전문 적 으로 제공 하지 않 습 니 다.
    그러나 그것 의 불 값 논 리 는 매우 간단 하 다.
  • 수치 0 은 불 가
  • 을 나타 낸다.
  • 빈 문자열 은 불 가짜
  • 을 나타 낸다.
  • 나머지 는 모두 불 진 이다.
  • 문자열 "0"도 진짜 입 니 다. 문자열
  • 이기 때 문 입 니 다.
  • awk 에서 정규 매 칭 도 반환 값 이 있 고 매 칭 성공 하면 1 을 되 돌려 주 며 매 칭 실패 하면 0
  • 을 되 돌려 줍 니 다.
  • awk 에서 모든 불 연산 도 반환 값 이 있 습 니 다. 불 진 반환 값 1, 불 가짜 반환 값 은 0
  • 입 니 다.
    awk '
    BEGIN{
        if(1){print "haha"}
        if("0"){print "hehe"}
        if(a=3){print "hoho"}  # if(3){print "hoho"}
        if(a==3){print "aoao"}
        if(/root/){print "heihei"}  # $0 ~ /root/
    }'
    

    awk 에서 비교 작업
    strnum 형식
    awk 의 가장 기본 적 인 데이터 형식 은 string 과 number (gawk 4.2.0 버 전 이후 정규 표현 식 형식 지원) 입 니 다.그러나 사용자 가 입력 한 데이터 (예 를 들 어 파일 에서 읽 은 각 필드 값) 는 string 형식 에 속 해 야 하지만, 때로는 수치 (예 를 들 어 $2=37) 처럼 보일 수도 있 고, 때로는 수치 형식 이 필요 할 수도 있다.
    awk 데이터 원본:
  • awk 내부 에서 발생 하 는 변수의 할당, 표현 식 또는 함수 의 반환 값 을 포함 합 니 다.
  • 다른 소스 에서 얻 은 데 이 터 는 모두 외부 데이터 이자 사용자 가 데 이 터 를 입력 하 는 것 입 니 다. 이런 데 이 터 는 모두 string 형식의 데이터 여야 합 니 다.

  • 그래서 POSIX 는 'numeric string' 이라는 '벽 위의 풀' 형식 을 정 의 했 고 gawk 에 서 는 strnum 형식 이 라 고 불 렀 다.가 져 온 사용자 데이터 가 숫자 로 보일 때 strnum 형식 입 니 다.strnum 형식 은 사용 할 때 수치 형식 으로 사 용 됩 니 다.
    strnum 형식 은 awk 에서 수치 상수, 문자열 상수, 표현 식 계산 결 과 를 제외 한 데이터 에 만 침 을 놓 습 니 다.예 를 들 어 파일 에서 읽 은 필드 $1, $2, ARGV 배열 의 요소 등 입 니 다.
    $ echo "30" | awk '{print typeof($0) " " typeof($1)}'
    strnum strnum
    $ echo "+30" | awk '{print typeof($1)}'
    strnum
    $ echo "30a" | awk '{print typeof($1)}'
    string
    $ echo "30 a" | awk '{print typeof($0) " " typeof($1)}'
    string strnum
    $ echo " +30 " | awk '{print typeof($0) " " typeof($1)}'
    strnum strnum
    

    크기 비교 작업
    비교 연산 자:
    < > <= >= != ==    、    
    in           
    

    비교 규칙:
           |STRING NUMERIC STRNUM
    -------|-----------------------
    STRING |string string  string
    NUMERIC|string numeric numeric
    STRNUM |string numeric numeric
    

    쉽게 말 하면 string 우선 순위 가 가장 높 고 string 유형 이 비교 에 참여 하면 모두 string 의 비교 방식 에 따라 암시 적 인 유형 전환 을 할 수 있 습 니 다.
    다른 때 는 모두 num 유형 으로 비교 합 니 다.
    $ echo ' +3.14' | awk '{print typeof($0) " " typeof($1)}'  #strnum strnum
    $ echo ' +3.14' | awk '{print($0 == " +3.14")}'    #1
    $ echo ' +3.14' | awk '{print($0 == "+3.14")}'     #0
    $ echo ' +3.14' | awk '{print($0 == "3.14")}'      #0
    $ echo ' +3.14' | awk '{print($0 == 3.14)}'        #1
    $ echo ' +3.14' | awk '{print($1 == 3.14)}'        #1
    $ echo ' +3.14' | awk '{print($1 == " +3.14")}'    #0
    $ echo ' +3.14' | awk '{print($1 == "+3.14")}'     #1
    $ echo ' +3.14' | awk '{print($1 == "3.14")}'      #0 
    $ echo 1e2 3|awk ’{print ($1

    문자열 을 비교 할 때 주의해 야 합 니 다. 이것 은 문자 마다 비교 하 는 것 입 니 다.
    "11" < "9"  # true
    "ab" < 99   # false
    

    논리 연산
    &&             
    ||             
    !               
    
    expr1 && expr2  #   expr1  ,     expr2
    expr1 || expr2  #   expr1  ,     expr2
    
    #  :
    # 1. && ||     
    # 2. !     && ||
    #      `! expr1 && expr2`   `(! expr1) && expr2`
    
    ! 은 데 이 터 를 수치의 1 또는 0 으로 변환 할 수 있 으 며 데이터 가 불 진 인지 불 가짜 인지 에 달 려 있다.!! 은 데 이 터 를 등가 불 값 의 1 또는 0 으로 변환 할 수 있다.
    $ awk 'BEGIN{print(!99)}'   # 0
    $ awk 'BEGIN{print(!"ab")}' # 0
    $ awk 'BEGIN{print(!0)}'    # 1
    $ awk 'BEGIN{print(!ab)}'   # 1,  ab     
    
    $ awk 'BEGIN{print(!!99)}'   # 1
    $ awk 'BEGIN{print(!!"ab")}' # 1
    $ awk 'BEGIN{print(!!0)}'    # 0
    $ awk 'BEGIN{print(!!ab)}'   # 0
    

    awk 의 변수 가 할당 되 지 않 았 을 때 기본 값 은 빈 문자열 이나 수치 0, 즉 불 가짜 로 초기 화 됩 니 다.그러면 할당 되 지 않 은 변수 에 대해 ! 작업 을 직접 수행 할 수 있 습 니 다.
    다음은 매우 재 미 있 는 awk 기법 입 니 다. ! 대 하나의 flag 를 여러 번 통 해 지정 한 범위 내 줄 만 출력 합 니 다.
    # a.txt
    $1==1{flag=!flag;print;next}    #    ID=1   ,flag=1
    flag{print}               #    ID=2,3,4,5  
    $1==5{flag=!flag;next}    # ID=5 ,flag=0
    

    이로써 awk 가 다 중 처리 모드 를 실현 할 수 있 습 니 다.예 를 들 어 지정 한 범위 내의 데 이 터 를 하나의 변수 에 저장 합 니 다.
    $1==1{flag=!flag;next}
    flag{multi_line=multi_line$0"
    "} $1==5{flag=!flag;next} END{printf multi_line}

    연산 자 우선 순위
    우선 순위 높 음 에서 낮 음: man awk
    ()
    $      # $(2+2)
    ++ --
    ^ **
    + - !   #      
    * / %
    + -
    space  #          `12 " " 23`  `12 " " -23`
    | |&
    < > <= >= != ==   #   >     ,  print/printf      
    ~ !~
    in
    &&
    ||
    ?:
    = += -= *= /= %= ^=
    

    같은 우선 순위 의 연산 자 는 보통 왼쪽 에서 연산 을 시작 하지만 아래 두 가지 예 외 는 모두 오른쪽 에서 왼쪽으로 연산 합 니 다.
  • 할당 연산: 예 를 들 어 = += -= *=
  • 멱 연산
  • a - b + c  =>  (a - b) + c
    a = b = c  =>  a =(b = c)
    2**2**3    =>  2**(2**3)
    

    또한 print 와 printf 에 나타 난 > 기 호 를 주의 하 십시오. 이 때 는 리 셋 기 호 를 표시 합 니 다. 우선 순위 가 낮은 연산 자가 나타 나 면 안 됩 니 다. 이 때 는 괄호 로 우선 순 위 를 바 꿀 수 있 습 니 다.예 를 들 면:
    awk 'BEGIN{print "foo" > a < 3 ? 2 : 1)'   #     
    awk 'BEGIN{print "foo" > (a < 3 ? 2 : 1)}' #   
    

    좋은 웹페이지 즐겨찾기