두 번째 필드가 "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