awk **script**에서 stdout으로 인쇄하는 것을 방지하는 방법(cli에서는 제외)

awk **script**에서 stdout으로 인쇄하는 것을 방지하는 방법(cli에서는 제외)

[Archlinux의 GNU awk v4.2.1]

awkcli에서 stdout으로 기본 인쇄 작업을 억제하는 것은 간단하고 UL에 잘 문서화되어 있습니다.여기. 스크립트에서 이 작업을 수행하면 머리가 아플 수 있습니다. 장난감 스크립트는 다음과 같습니다.

#!/usr/bin/awk -f
BEGIN {FS=","} 
FNR > 1          # skip header
{   
    if ( $1 == $2 ) {
        if ( NR == 4 ) {
            printf("*** Print NR=4 ok. \n")
        } else {
            print > "/dev/null"  # print nothing
        }
    } else {
        printf("=== Fields 1 and 2 not equal (NR=%s). \n",NR)
    }
}

장난감 데이터:

col1 col2
1,3
2,2
aa,aa
3.01,-353.01
4.1,4.1
101,101
hello, hello
asd,koi0

그리고 예상/원하는 출력은 다음과 같습니다.

=== Fields 1 and 2 not equal (NR=2). 
*** Print NR=4 ok. 
=== Fields 1 and 2 not equal (NR=5).
=== Fields 1 and 2 not equal (NR=8).
=== Fields 1 and 2 not equal (NR=9).

대신 나는 다음을 얻습니다.

=== Fields 1 and 2 not equal (NR=1). 
1,3
=== Fields 1 and 2 not equal (NR=2). 
2,2
aa,aa
*** Print NR=4 ok. 
3.01,-353.01
=== Fields 1 and 2 not equal (NR=5). 
4.1,4.1
101,101
hello, hello
=== Fields 1 and 2 not equal (NR=8). 
asd,koi0
=== Fields 1 and 2 not equal (NR=9). 

stdout으로의 출력을 억제하기 위해 대신 getline, {}, nextprintf("")심지어 이상한 것을 사용해 보았습니다 . 분명히 내가 그 빌어먹을 스크립트에서 뭔가 엄청나게 잘못된 일을 하고 있는데 아무것도 찾을 수 없는 것 같군요...ORS=""; print ""; ORS="\n"print > "/dev/null"

답변1

이것오직오류는 다음과 같습니다

FNR > 1          # skip header
{ 

해야한다

FNR > 1 {        # skip header

조건이 있는 코드 블록은 조건과 동일한 줄에서 시작해야 합니다.

원래 대본은 무엇이었나요?실제로하는 것이 먼저다

FNR > 1

그러면 두 번째 줄부터 시작하는 모든 줄이 인쇄됩니다(조건에 연결된 코드 블록이 없는 경우 기본 동작은 조건이 true일 때 블록이 true인 것처럼 현재 레코드를 인쇄하는 것입니다 { print }).

그런 다음 다음 블록을 적용합니다.라인(블록에 연관된 조건이 없기 때문).

이것은 GNU 기능이 아닙니다 awk. 모든 awk구현은 다음과 같아야 합니다.


나머지 스크립트는 다음과 같습니다.

    } else {
        print > "/dev/null"  # print nothing
    }

이건 제거해서 남겨두시면 됩니다

#!/usr/bin/awk -f

BEGIN { FS = "," } 

FNR > 1 {   
    if ( $1 == $2 ) {
        if ( NR == 4 )
            printf("*** Print NR=4 ok.\n")
    } else
        printf("=== Fields 1 and 2 not equal (NR=%s).\n", NR)
}

또는,

#!/usr/bin/awk -f

BEGIN { FS = "," } 

FNR == 1 { next }

$1 == $2 && NR == 4 { printf("*** Print NR=4 ok.\n") }
$1 != $2            { printf("=== Fields 1 and 2 not equal (NR=%s).\n", NR) }

관련 정보