条件エラーが発生した場合 awk [閉じる]

条件エラーが発生した場合 awk [閉じる]

条件に基づいてフィルタリングする awk コマンドを作成しました。

awk '{if(( (substr($0,9,3) == "TGO") &&  ((substr($0,1,4) == "9123" || (substr($0,1,4) == "9704"))) print (substr($0,279,2),substr($0,1,4),substr($0,5,8));}' Downloadfinance.txt

構文エラーです。いくつかの方法を試しましたが、まだ同じ例外が発生します。

これはエラーです。

awk: cmd. line:1: {if(( (substr($0,9,3) == "TGO") &&  ((substr($0,1,4) == "9123" || (substr($0,1,4) == "9704"))) print (substr($0,9,3),substr($0,1,4),substr($0,5,8));}
awk: cmd. line:1:                                                                                                 ^ syntax error
awk: cmd. line:1: {if(( (substr($0,9,3) == "TGO") &&  ((substr($0,1,4) == "9123" || (substr($0,1,4) == "9704"))) print (substr($0,9,3),substr($0,1,4),substr($0,5,8));}
awk: cmd. line:1:                                                                                                                                                       ^ syntax error

答え1

2つが欠落しているか、1つが欠落していて)もう)1つがありません。(

修正されたコード(追加の角かっこが削除されました。改行は説明のためのものであり、実際には実行されません):

{
        if (
                substr($0,9,3) == "TGO" &&
                (
                        substr($0,1,4) == "9123" || substr($0,1,4) == "9704"
                )
        )
                print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

または(この構文は改行文字の位置に適しています)

{
        if (substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704" ))
                print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

または(パターンジョブメカニズムを使用)

substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704") {
        print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

コードの形式は上記の最初の変形と同じですが、すべての括弧はそのまま残ります。

{
        # too many ( below
        if ((
                (substr($0,9,3) == "TGO") &&
                (
                        # missing ) below, alt. too many ( and )
                        (substr($0,1,4) == "9123" || (substr($0,1,4) == "9704")
                )
        )
                print (substr($0,279,2),substr($0,1,4),substr($0,5,8))
}

答え2

テストするファイルを提供していないので、私はわかりませんが、次のように書くことを考えています。

awk '{ if( substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704")){ print substr($0,279,2),substr($0,1,4),substr($0,5,8)}}' Downloadfinance.txt

またはより明確に言えば:

awk '{ 
        if( substr($0,9,3) == "TGO" && 
            (substr($0,1,4) == "9123" || substr($0,1,4) == "9704")){ 
                print substr($0,279,2),substr($0,1,4),substr($0,5,8)
            }
    }' Downloadfinance.txt

答え3

あるいは、if条件をルール前提条件に移動することもできます。

awk  'substr($0,9,3) == "TGO"  && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704"){
                print substr($0,279,2),substr($0,1,4),substr($0,5,8)
              }'

これを次のように単純化することもできます。

awk 'substr($0,9,3) == "TGO"  && (/^9123/ || /^9704/) { print .... }'

答え4

使用する場合牛に似た一種の栄養あっ(またはできる)特徴があります。この問題を直接処理するには:

awk -vFIELDWIDTHS="4 4 3 267 2" '$3=="TGO" && ($1=="9123"||$1=="9704"){ print $5,$1,$2 }'

関連情報