提问人:E.R.Tan 提问时间:12/9/2020 更新时间:12/9/2020 访问量:119
为什么awk在使用FPAT打印线时要添加额外的分隔符
why is awk adding extra separators when printing line with FPAT
问:
我编写了一个简单的脚本,该脚本应该使用不带引号的逗号解析 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
**请注意额外的逗号
答:
1赞
Ed Morton
12/9/2020
#1
听起来像是那个旧 gawk 中的一个错误,多年来已经有几个,因为它是棘手的代码,例如:
- https://lists.gnu.org/archive/html/bug-gawk/2011-08/msg00001.html
- https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-10/msg00041.html
- https://lists.gnu.org/archive/html/bug-gawk/2020-04/msg00023.html
获取更新的 gawk 版本,gawk 当前在 5.1.0 上,您的版本 4.0.2 已过时 8 年。同时,尝试在脚本顶部添加以下内容作为解决方法:
{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }
因为这可以解决我熟悉的 2 个 FPAT 错误,或者有时甚至只是引用作品,例如.NF
{nf=NF}
话虽如此,意味着重复“没有逗号或空白”,但您的输入看起来只是想要“没有逗号”,这将是 - 也许更改为它可以替代解决问题?[^, ]*
[^,]*
评论
FPAT = "\"[^\"]*\"|[^ ,]+"