awk 시리즈 에 정통 (17): awk 불 값, 비교 및 논리 연산
awk 에 서 는 다른 언어 처럼 true, false 와 같은 키 워드 를 전문 적 으로 제공 하지 않 습 니 다.
그러나 그것 의 불 값 논 리 는 매우 간단 하 다.
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 데이터 원본:
그래서 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)}' #
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.