Linux 无法分析gawk中开头为空字段的CSV

Linux 无法分析gawk中开头为空字段的CSV,linux,awk,Linux,Awk,我创建了GawkgnuAWK5.0.1,API:2.0GNUMPFR4.0.2,GNUMP6.1.2Script1。这里 input.csv: ,b,c,d,e,f g,h,i,j,k,l 脚本1: gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{print $1,$2,$3,$4,$5,$6}' input.csv 脚本1输出: script1的输出全部为空 ,,,,, g,h,i,j,k,l 我创建了script2以确保字段被解析。这里 脚本

我创建了GawkgnuAWK5.0.1,API:2.0GNUMPFR4.0.2,GNUMP6.1.2Script1。这里

input.csv:

,b,c,d,e,f
g,h,i,j,k,l
脚本1:

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{print $1,$2,$3,$4,$5,$6}' input.csv
脚本1输出: script1的输出全部为空

,,,,,
g,h,i,j,k,l
我创建了script2以确保字段被解析。这里

脚本2:

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)}' input.csv
为什么我的script1无法解析gawk中开头为空字段的CSV?
诚恳的

不是答案,但太长了,无法发表评论

这似乎是一种奇怪的行为。一个更简单的测试用例

这个很好用

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1 "$"}'
$
这也是

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $2 "$"}'
b$
但不是这个

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1,$2 "$"}'
_$

不是答案,但评论太长

这似乎是一种奇怪的行为。一个更简单的测试用例

这个很好用

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1 "$"}'
$
这也是

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $2 "$"}'
b$
但不是这个

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1,$2 "$"}'
_$

这是一个bug,现在向GNU awk开发人员报告,同时您可以通过以下方式解决它:

$ gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} {print $1,$2,$3,$4,$5,$6}' input.csv
,b,c,d,e,f
g,h,i,j,k,l
以下是问题的简化版本,基于:

可以使用与前一个bug相同的方法来解决此问题:

显然,也可以通过访问NF来解决此问题,例如:

$ echo ',b' | gawk -v FPAT='[^,]*' '{NF; print $1, $2}'
 b
$

这是一个bug,现在向GNU awk开发人员报告,同时您可以通过以下方式解决它:

$ gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} {print $1,$2,$3,$4,$5,$6}' input.csv
,b,c,d,e,f
g,h,i,j,k,l
以下是问题的简化版本,基于:

可以使用与前一个bug相同的方法来解决此问题:

显然,也可以通过访问NF来解决此问题,例如:

$ echo ',b' | gawk -v FPAT='[^,]*' '{NF; print $1, $2}'
 b
$

您的实际输入文件看起来如何?它是否总是使用逗号作为字段分隔符,或者如果没有,请您发布一些与实际输入文件接近的示例,我们可以看到它在实际数据上发生了什么。script1为我提供了预期的输出。顺便说一句,为了避免逃离地狱,把你的模式放在单引号之间。@RavinderSingh13谢谢。我使用input.csv和updatescript@Casimiret希波莱特谢谢。我使用单引号,更新脚本您的实际输入文件看起来如何?它是否总是使用逗号作为字段分隔符,或者如果没有,请您发布一些与实际输入文件接近的示例,我们可以看到它在实际数据上发生了什么。script1为我提供了预期的输出。顺便说一句,为了避免逃离地狱,把你的模式放在单引号之间。@RavinderSingh13谢谢。我使用input.csv和updatescript@Casimiret希波莱特谢谢。我使用单引号,更新脚本是的,这是一个错误。将其更改为echo',b'| gawk-v FPAT='[^,]*'-v OFS='''{print NF,$1,$2$}',它会输出2|b$,这是错误吗@oguzismail是的。现在检查一下,看看是相同的还是相关的。不,它不是完全相同的,只是可以用同样的方法处理。不管怎样,我都会发电子邮件给这些家伙,并在有链接的时候在这里发布一个链接。是的,这是一个bug。将其更改为echo',b'| gawk-v FPAT='[^,]*'-v OFS='''{print NF,$1,$2$}',它会输出2|b$,这是错误吗@oguzismail是的。现在检查一下,看看是相同的还是相关的。不,它不是完全相同的,只是可以用同样的方法处理。不管怎样,我都会发电子邮件给这些家伙,并在这里发布一个链接。我感谢你的合作,这非常有帮助。非常感谢。我感谢你的合作,这很有帮助。非常感谢。