awk는 숫자("40")와 숫자 및 기타 문자("203-344-1234")를 포함하는 문자열을 어떻게 비교합니까?

awk는 숫자("40")와 숫자 및 기타 문자("203-344-1234")를 포함하는 문자열을 어떻게 비교합니까?

텍스트 파일이 있습니다 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'비교 하기 때문입니다 .


비교 유형이란 무엇입니까?

~에서[GNU awk] 문자열 유형과 숫자 유형:

두 피연산자를 비교할 때 문자열 비교 또는 숫자 비교를 사용할 수 있습니다. 이는 다음 대칭 행렬에 따른 피연산자의 속성에 따라 달라집니다.

    +---------------------------------------------------------
    |                 STRING          NUMERIC         STRNUM
    +---------------------------------------------------------
    | STRING  |       string          string          string
    | NUMERIC |       string          numeric         numeric
    | STRNUM  |       string          numeric         numeric
    +---------------------------------------------------------

숫자를 문자열로 변환하는 방법

~에서[GNU awk] 비교 연산자:

혼합 유형의 피연산자를 비교할 때 숫자 피연산자는 사용된 값을 문자열로 변환합니다 CONVFMT(참조: 문자열과 숫자의 변환).

위의 링크에서 비교를 위해 숫자를 문자열로 변환하는 방법을 볼 수 있습니다. 문자열은 sprintf()awk 사전 정의 변수를 호출하여 생성되고 CONVFMT형식이 지정 되며 "%.6g"기본적으로 최대 6개의 소수 유효 숫자를 유지합니다. 그러나 정수의 경우:

특별한 경우로, 숫자가 정수인 경우 이를 문자열로 변환한 결과는 값에 관계없이 항상 정수입니다 CONVFMT.

이 예에서 $4is는 203-344-1234숫자가 아닌 문자열입니다. 두 번째 인수는 문자열로 변환된 숫자입니다 '40'( CONVFMT정수이므로 값이 무엇이든).


문자열이나 숫자를 강제로 입력하는 방법

같은 페이지의 일부 추가 정보:

어떤 이유로 숫자를 문자열로 강제 변환해야 하는 경우 숫자를 빈 문자열과 연결하세요 "". 문자열을 숫자로 강제 변환하려면 문자열에 0을 추가하세요.

때로는 필드가 숫자로 사용되도록 하기 위해 로 작성합니다 $1+0. 예를 들어, 이 경우 $4+0처음 세 자리의 정수가 되도록 강제로 설정 하려면 203다음으로 시작하는 필드를 만들어 보십시오. 숫자가 아닌 첫 번째 문자는 끝 번호).

관련 정보