我有下面的 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 ,这告诉它忽略两者和。BEGIN
FPAT = "([^,]*)|(\"[^\"]*\")"
FS
-F ','
" "
split(_arr,arr," ")
FS
FPAT
然后您尝试使用NF
基于FS
or 的IS 设置FPAT
,以您的代码中最后定义的为准(我相信这将被视为FPAT
给定您的代码,但不要这样做),但由于某种原因您希望它与使用硬编码作为字段分隔符的len
完全不相关的输出相同。split()
" "
另外, FS 和 FPAT 正在分割输入文件的行,同时分割作为变量传递的split(_arr,...," ")
字符串的内容- 2 个完全不相关的东西。_arr
您还传入一个字符串,_arr="(1 2 3)"
但将其称为数组,然后当您将其拆分为实际数组时,您将拥有(1
and 2
and 3)
(在这些部分中带有括号),但您没有在您的数组中使用任何这些值脚本。
因此,很明显为什么您的代码的行为如此(您对字段分隔符的 3 种不同定义,然后通过拆分vs set by的内容或拆分 的内容来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 更新的 gawk 版本(当前版本是 5.2.1)。