gawk は、NF とカスタム変数が同じ値を持っていても、別の方法で処理します。

gawk は、NF とカスタム変数が同じ値を持っていても、別の方法で処理します。

渡された配列の長さを変数として使用する次のawkスクリプトがあります。

BEGIN {
    FPAT = "([^,]*)|(\"[^\"]*\")"
    len=split(_arr,arr," ")
}

{
    for(i=1;i<=len;i++){
        print("i: " i " value i: " $i)
    }
}

次のコマンドの場合

gawk -F ',' -v _arr="(1 2 3)" -f stackOverflow.awk example2.csv

そして次の入力

,112,41/12/2023
new,23,21/10/2022
,421,11/01/12
abce,421,11/14/12

私が得た結果は次のとおりです。

i: 1 value i: 
i: 2 value i: 
i: 3 value i: 
i: 1 value i: new
i: 2 value i: 23
i: 3 value i: 21/10/2022
i: 1 value i: 
i: 2 value i: 
i: 3 value i: 
i: 1 value i: abce
i: 2 value i: 421
i: 3 value i: 11/14/12

しかし、以下のようにlenの代わりにNFを使用すると、

BEGIN {
    FPAT = "([^,]*)|(\"[^\"]*\")"
    len=split(_arr,arr," ")
}

{
    for(i=1;i<=NF;i++){
        print("i: " i " value i: " $i)
    }
}

私が望む結果を得る。

i: 1 value i: 
i: 2 value i: 112
i: 3 value i: 41/12/2023
i: 1 value i: new
i: 2 value i: 23
i: 3 value i: 21/10/2022
i: 1 value i: 
i: 2 value i: 421
i: 3 value i: 11/01/12
i: 1 value i: abce
i: 2 value i: 421
i: 3 value i: 11/14/12

私はそれを使用しています

GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.

同じバージョンを使用することを好む

ベストアンサー1

ここでは、文字列を分割するいくつかの異なる方法を混在しています。FPATwithセクションで文字列を定義し、コマンドラインでもwithを定義してから、フィールド区切り文字で分割を呼び出すと、すべてを無視するように指示します。BEGINFPAT = "([^,]*)|(\"[^\"]*\")"FS-F ','" "split(_arr,arr," ")FSFPAT

その後、コードで最後に定義されたORNFベースのIS設定を使用しようとしますが(あなたのコードではこれが考慮されると思いますが、そうしないでください)、何らかの理由で完全に無関係な作業をしたいと思います。フィールド区切り文字でハードコーディングの出力は同じです。FSFPATFPATlensplit()" "

さらに、FSとFPATは入力ファイルの行を分割し、変数に渡された文字列の内容を分割しますsplit(_arr,...," ")。 2つはまったく関係ありません。_arr

また、文字列を渡します_arr="(1 2 3)"が、これを配列と呼び、それを実際の配列に分割すると、(1and23)(該当する部分には括弧を含む)がありますが、配列にはありません。次のいずれかを使用してください。価値スクリプト。

したがって、コードがそのように機能する理由は明らかです(フィールド区切り文字の3つの異なる定義があり、分割に設定、len内容別に設定、または内容別に分割)。何をしたいのか明確ではありません。または私達が助けることができます。あなたはすべてのことを正しく行います。split(_arr,...," ")_arrNFFSFPAT$0

しかし、gawkの以前のバージョンにはFPATのバグがあります。これらの問題の説明と解決策については、次のスレッドを参照してください。

残りのものがあります。

そして、5.0.1(現在のバージョンは5.2.1)より最新のバージョンのgawkを入手してください。

おすすめ記事