나한테 테이블이 있어
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;
}