[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
これにより、2行目から始まるすべての行が印刷されます(条件に関連付けられたコードブロックがない場合、デフォルトの動作は、条件が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) }