AWKでEND特殊モードを使用するときの構文エラー

AWKでEND特殊モードを使用するときの構文エラー

私はシェルスクリプトの初心者で、私が読んでいるファイルから配列の最大値を印刷したいと思います。 ENDステートメントを使用しないと、コードは正常に機能しますが、ENDステートメントを追加すると、ifステートメントの近くに構文エラーがあるというエラーが発生します。コードでエラーを見つけるのに役立ちますか?

#!/bin/sh
awk '
if(FNR==7)
{
natoms=$1+$2+$3
print natoms
}
if(FNR==8) {
       if($1=="selective"){
        start=10
        end=start+natoms-1
        }
       else{
        start = 9
        end = start+natoms-1
        }
       }
if(start<=FNR && FNR<=end){
                
                arr[FNR-10+1] = $3
                print max[arr]
              }
END {print natoms}' POSCAR

答え1

正しいインデントを使用する習慣を取ると、間違いをより簡単に見ることができます。良いプログラミングエディタはこの問題を解決するのに役立ちます。

awkプログラムが大きくなったら、awkコードを独自のファイルに入れます。たとえば、次のような場合poscar.awk

FNR==7 {
    natoms=$1+$2+$3
    print natoms
}
FNR==8 {
    if($1=="selective"){
        start=10
        end=start+natoms-1
    }
    else{
        start = 9
        end = start+natoms-1
    }
}
start<=FNR && FNR<=end {
    arr[FNR-10+1] = $3
    print max[arr]
}
END {print natoms}

これにより、次のように実行できます。

awk -f poscar.awk POSCAR

print max[arr]==>いいえmax 大量にあなたのコードから。そしてawkには機能がありませんmax()。最大値を手動で追跡する必要があります。

関連情報