为什么awk在使用FPAT打印线时要添加额外的分隔符

why is awk adding extra separators when printing line with FPAT

提问人:E.R.Tan 提问时间:12/9/2020 更新时间:12/9/2020 访问量:119

问:

我编写了一个简单的脚本,该脚本应该使用不带引号的逗号解析 CSV 字段。但是,在使用 FPAT 时,我注意到打印添加了一个额外的逗号,每当修改变量时,有人知道为什么吗?

脚本:

gawk 'BEGIN { 
    FPAT = "([^, ]*)|(\"[^\"]+\")"
    OFS=","
  }
  {
    $1 = "abc"
    print
  }' file.txt

文件内容:.txt

blabla,xxx,yyy,zzz
ggg,xxx,yyy,zzz
"aaaa, aaa",xxx,zzz,yyy

以上内容在我运行GNU AWK 4.1.0(ZShell)打印的Mac上运行良好

abc,xxx,yyy,zzz
abc,xxx,yyy,zzz
abc,xxx,zzz,yyy 

但是,当我在 RH Box 7.8 上运行它时,使用 GNU 4.0.2 (bash),它打印如下

abc,,xxx,yyy,zzz
abc,,xxx,yyy,zzz
abc,,xxx,zzz,yyy

**请注意额外的逗号

csv awk 替换 redhat 引号

评论

0赞 anubhava 12/9/2020
你能试试吗:FPAT = "\"[^\"]*\"|[^ ,]+"

答:

1赞 Ed Morton 12/9/2020 #1

听起来像是那个旧 gawk 中的一个错误,多年来已经有几个,因为它是棘手的代码,例如:

获取更新的 gawk 版本,gawk 当前在 5.1.0 上,您的版本 4.0.2 已过时 8 年。同时,尝试在脚本顶部添加以下内容作为解决方法:

{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }

因为这可以解决我熟悉的 2 个 FPAT 错误,或者有时甚至只是引用作品,例如.NF{nf=NF}

话虽如此,意味着重复“没有逗号或空白”,但您的输入看起来只是想要“没有逗号”,这将是 - 也许更改为它可以替代解决问题?[^, ]*[^,]*