텍스트 파일이 있습니다 employees
.
Chen Cho 5/19/63 203-344-1234 $76
Tom Billy 4/12/45 913-972-4536 $102
Larry White 11/2/54 908-657-2389 $54
Bill Clinton 1/14/60 654-576-4114 $201
Steve Ann 9/15/71 202-545-8899 $58
이 작업을 수행하면 awk '$4 < 40' employees
다음을 얻습니다.
203-344-1234
202-545-8899
< 65
비교할 때 까지 동일한 출력을 제공합니다 $4 < 66
.
203-344-1234
654-576-4114
202-545-8899
나는 이 행동에 혼란스러워요 awk
. 비교를 수행할 수 없다는 오류가 발생하는 대신 필드의 처음 두 자리 숫자만 비교하는 것 같습니다.
awk
내 질문은: 이 경우 어떻게 비교/동작합니까? 감사해요.
답변1
간단히 말해서, 이것은 GNU의 알파벳순 비교입니다 awk
.
'203-344-1234'
문자열( )과 숫자( )를 '40'
비교 하기 때문입니다 .
비교 유형이란 무엇입니까?
두 피연산자를 비교할 때 문자열 비교 또는 숫자 비교를 사용할 수 있습니다. 이는 다음 대칭 행렬에 따른 피연산자의 속성에 따라 달라집니다.
+--------------------------------------------------------- | STRING NUMERIC STRNUM +--------------------------------------------------------- | STRING | string string string | NUMERIC | string numeric numeric | STRNUM | string numeric numeric +---------------------------------------------------------
숫자를 문자열로 변환하는 방법
~에서[GNU awk] 비교 연산자:
혼합 유형의 피연산자를 비교할 때 숫자 피연산자는 사용된 값을 문자열로 변환합니다
CONVFMT
(참조: 문자열과 숫자의 변환).
위의 링크에서 비교를 위해 숫자를 문자열로 변환하는 방법을 볼 수 있습니다. 문자열은 sprintf()
awk 사전 정의 변수를 호출하여 생성되고 CONVFMT
형식이 지정 되며 "%.6g"
기본적으로 최대 6개의 소수 유효 숫자를 유지합니다. 그러나 정수의 경우:
특별한 경우로, 숫자가 정수인 경우 이를 문자열로 변환한 결과는 값에 관계없이 항상 정수입니다
CONVFMT
.
이 예에서 $4
is는 203-344-1234
숫자가 아닌 문자열입니다. 두 번째 인수는 문자열로 변환된 숫자입니다 '40'
( CONVFMT
정수이므로 값이 무엇이든).
문자열이나 숫자를 강제로 입력하는 방법
같은 페이지의 일부 추가 정보:
어떤 이유로 숫자를 문자열로 강제 변환해야 하는 경우 숫자를 빈 문자열과 연결하세요
""
. 문자열을 숫자로 강제 변환하려면 문자열에 0을 추가하세요.
때로는 필드가 숫자로 사용되도록 하기 위해 로 작성합니다 $1+0
. 예를 들어, 이 경우 $4+0
처음 세 자리의 정수가 되도록 강제로 설정 하려면 203
다음으로 시작하는 필드를 만들어 보십시오. 숫자가 아닌 첫 번째 문자는 끝 번호).