渡された配列の長さを変数として使用する次の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
ここでは、文字列を分割するいくつかの異なる方法を混在しています。FPAT
withセクションで文字列を定義し、コマンドラインでもwithを定義してから、フィールド区切り文字で分割を呼び出すと、すべてを無視するように指示します。BEGIN
FPAT = "([^,]*)|(\"[^\"]*\")"
FS
-F ','
" "
split(_arr,arr," ")
FS
FPAT
その後、コードで最後に定義されたORNF
ベースのIS設定を使用しようとしますが(あなたのコードではこれが考慮されると思いますが、そうしないでください)、何らかの理由で完全に無関係な作業をしたいと思います。フィールド区切り文字でハードコーディングの出力は同じです。FS
FPAT
FPAT
len
split()
" "
さらに、FSとFPATは入力ファイルの行を分割し、変数に渡された文字列の内容を分割しますsplit(_arr,...," ")
。 2つはまったく関係ありません。_arr
また、文字列を渡します_arr="(1 2 3)"
が、これを配列と呼び、それを実際の配列に分割すると、(1
and2
と3)
(該当する部分には括弧を含む)がありますが、配列にはありません。次のいずれかを使用してください。価値スクリプト。
したがって、コードがそのように機能する理由は明らかです(フィールド区切り文字の3つの異なる定義があり、分割に設定、len
内容別に設定、または内容別に分割)。何をしたいのか明確ではありません。または私達が助けることができます。あなたはすべてのことを正しく行います。split(_arr,...," ")
_arr
NF
FS
FPAT
$0
しかし、gawkの以前のバージョンにはFPATのバグがあります。これらの問題の説明と解決策については、次のスレッドを参照してください。
残りのものがあります。
- https://lists.gnu.org/archive/html/bug-gawk/2015-09/msg00034.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html
そして、5.0.1(現在のバージョンは5.2.1)より最新のバージョンのgawkを入手してください。