awk에서 두 가지 조건 세트를 선택하세요.

awk에서 두 가지 조건 세트를 선택하세요.

나한테 테이블이 있어

1 1
1 0
0 1
0 0

다음으로 구성된 두 가지 선택 기준 세트를 사용하여 행을 인쇄하고 싶습니다.또는.

표준 세트 1: (열 1 >= 1 및 열 2 = 0)

또는

표준 세트 2: (열 1 = 0, 열 2 >= 1)

예상 출력은 다음과 같습니다.

1 0
0 1

비슷한거 썼는데 안되네요

awk '($1>=1 && $2=0)||($1=0 && $2>=1) {print $0}'

문제는 무엇입니까?

답변1

문제는 =동등성 테스트( ) 대신 할당 연산자( ) 를 사용하고 있다는 것입니다 ==. 무언가에 0을 할당한 부울 결과는 "false"입니다. 이것이 바로 테스트가 결코 성공하지 못하는 이유입니다.


일반적인 awk명령은

awk '($1 >= 1 && $2 == 0) || ($1 == 0 && $ 2 >= 1)'

{ print $0 }이는 작업이 없는 모든 조건에 대한 기본 작업이므로 필요하지 않습니다 .

첫 번째 열과 두 번째 열에서 동일한 값을 가진 행만 건너뛰려는 경우(주어진 데이터에 대해 동일한 출력 제공):

awk '$1 != $2'

두 경우 모두의 출력은 다음과 같습니다.

1 0
0 1

답변2

awk비교하는 =대신 명령에 사용할 때 발생하는 문제 외에도==선행은 이루기가 어렵다 지적. 귀하의 입력과 사용 중인 명령을 통해 제가 이해하는 한, 최소한 하나가 0인 경우 이 줄이 필요합니다.

음수 값이 없다고 가정하면 다음을 사용할 수 있습니다.

awk '($1 && !$2) || (!$1 && $2)' infile

또는 더 짧게 -사용할 수도 있습니다.

awk '($1 * !$2) + (!$1 * $2)' infile

답변3

대체 egrep솔루션:

egrep '^([1-9][0-9]* *0|0 *[1-9][0-9]*)$' file

산출:

1 0
0 1

답변4

OR을 사용할 필요가 없습니다.그 사이에 더 많은 기준을 추가할 수도 있습니다. 각 기준을 별도의 줄에 추가하고 "criteria.awk"와 같은 텍스트 파일에 저장한 후 다음과 같이 실행하세요. awk -f 기준 .awktable.dat

awkscript 파일의 내용은 다음과 같습니다.

{
    if ($1 >= 1 && $2 == 0) print $0;
    if($1 == 0 && $2 >=1) print $0;
}

관련 정보