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

但是如果我使用 NF 而不是 len ,如下所示

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

您在这里混合了几种不同的分割字符串的方法 - 您在with 部分FPAT中定义,但也在命令行上定义 with ,然后使用字段分隔符 with 调用 split ,这告诉它忽略两者和。BEGINFPAT = "([^,]*)|(\"[^\"]*\")"FS-F ','" "split(_arr,arr," ")FSFPAT

然后您尝试使用NF基于FSor 的IS 设置FPAT,以您的代码中最后定义的为准(我相信这将被视为FPAT给定您的代码,但不要这样做),但由于某种原因您希望它与使用硬编码作为字段分隔符的len完全不相关的输出相同。split()" "

另外, FS 和 FPAT 正在分割输入文件的行,同时分割作为变量传递的split(_arr,...," ")字符串的内容- 2 个完全不相关的东西。_arr

您还传入一个字符串,_arr="(1 2 3)"但将其称为数组,然后当您将其拆分为实际数组时,您将拥有(1and 2and 3)(在这些部分中带有括号),但您没有在您的数组中使用任何这些值脚本。

因此,很明显为什么您的代码的行为如此(您对字段分隔符的 3 种不同定义,然后通过拆分vs set by的内容或拆分 的内容来len设置),但不清楚您要做什么,或者我们可以提供帮助你做任何正确的事情。split(_arr,...," ")_arrNFFSFPAT$0

话虽如此,旧版本的 gawk 中存在 FPAT 错误,请参阅以下线程以获取此类问题的描述和解决方法:

还有一些:

并获取比 5.0.1 更新的 gawk 版本(当前版本是 5.2.1)。

相关内容