[Archlinux의 GNU awk v4.2.1]
awk
cli에서 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
, {}
, next
및 printf("")
심지어 이상한 것을 사용해 보았습니다 . 분명히 내가 그 빌어먹을 스크립트에서 뭔가 엄청나게 잘못된 일을 하고 있는데 아무것도 찾을 수 없는 것 같군요...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) }