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

これにより、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) }

関連情報