1 필드의 내용을 기반으로 awk 선택을 만드는 방법은 무엇입니까?

1 필드의 내용을 기반으로 awk 선택을 만드는 방법은 무엇입니까?

두 번째 필드가 "2"인 모든 레코드를 선택하려면 어떻게 해야 합니까?

내 데이터는 다음과 같습니다

$ cat numbers.txt 
1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24

내 awk는 다음과 같습니다

 awk '$2 - /^2$/ {print}' numbers.txt 

하지만 첫 번째 행뿐만 아니라 모든 행을 얻습니다.

1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24

답변1

당신은 사용해야합니다매치 연산자~, 아니요빼기 연산자 -:

$ awk '$2 ~ /^2$/' file

또는 같음 ==연산자를 사용하세요.@Glenn Jackman의 답변.

그러나 모든 행을 얻는 이유를 설명하기 위해 이전 솔루션을 살펴보겠습니다.

awk '$2 - /^2$/ {print}' numbers.txt

여기에서 각 입력 줄에 대해 식이 $2 - /^2$/true이면 해당 줄을 인쇄하고, 그렇지 않으면 아무 작업도 수행하지 않습니다. 모든 행을 얻으므로 표현식은 항상 $2 - /^2$/true로 평가되는 것 같습니다.

이 표현을 평가하는 방법은 무엇입니까 awk?

빼기 연산자를 사용하는 경우 결과 유형은 숫자입니다. $2변수는 숫자이지만 /^2$/정규 표현식입니다. 그 값은 무엇입니까?

음, 부터POSIX awk 문서:

ERE 토큰이 "~" 또는 "!~" 연산자 오른쪽 이외의 컨텍스트에서 표현식으로 발생하거나 아래 설명된 내장 함수 중 하나에 대한 인수로 발생하는 경우 결과 표현식의 값은 다음과 같습니다. 다음과 같습니다:

$0 ~ /ere/

따라서 awk프로그램은 다음과 같습니다.

awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt

정규식을 사용하여 각 입력 라인을 확인하는 것을 볼 수 있습니다 /^2$/. 일치하는 입력 행이 없으므로 표현식의 결과는 $0 ~ /^2$/0이 됩니다.

입력한 내용을 기준으로 모든 두 번째 필드 값은 0보다 큽니다(동일하게 유지하려면 0을 빼세요). 따라서 awk표현식 $2 - /^2$/은 항상 true이므로 awk모든 행이 인쇄됩니다.

답변2

~은 패턴 일치 연산자이지 가 아닙니다 -. 그러나 동등성을 테스트하려면 동등 연산자를 사용하십시오.==

awk '$2 == 2' numbers.txt

관련 정보