1

运行 awk 脚本时出现语法错误,该脚本是:

awk -F\" 'for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}'

实际数据的示例如下(封闭和管道分隔):

"data"|"data"|"data"|"data"|"data"

正如您从代码中看到的那样,我想要做的是:读取所有字段,如果字段是数字(始终是十进制),则用逗号替换该点。我还尝试在 gsub 函数中转义逗号:

awk -F\" 'for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,\,,$1) }}'

但它并没有解决问题,你知道问题出在哪里吗?与正则表达式的比较看起来很好,循环和 if 语句也是,错误消息是

    awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:            ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                     ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                           ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                                                 ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                                                          ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                                                           ^ syntax error
awk: cmd. line:1: for( i = 1 ; i <= NF; i++){if ($i == "^[0-9]+$"){ gsub(.,,,$1) }}
awk: cmd. line:1:                                                              ^ 1 is invalid as number of arguments for gsub
4

2 回答 2

1

这条线可能对你有用:

awk  'BEGIN{FS=OFS="\""}{for(i=1;i<=NF;i++)if($i~/[0-9\.]*/)gsub("\\.",",",$i)}1' file

测试 :

kent$  echo '"1000.18"|"4.8"|"data"|"data"|"3.5"'|awk  'BEGIN{FS=OFS="\""}{for(i=1;i<=NF;i++)if($i~/[0-9\.]*/)gsub("\\.",",",$i)}1'
"1000,18"|"4,8"|"data"|"data"|"3,5"

您的代码中的问题是:

  • 你的 for 循环应该用{}
  • 你应该使用~, 而不是==正则表达式匹配
  • 即使您使用了〜,您的正则表达式也不正确。^[0-9]+$仅匹配数字,不匹配 20.8。因为有一个点
  • 在 gsub 中,第一个参数是要替换的正则表达式。如果你只是在里面放一个点。它意味着任何字符。你必须逃避它,让 gsub 知道你只想替换“点”。
于 2012-12-18T10:00:21.610 回答
0

您之前缺少一个花括号。你可以这样尝试

awk -F\" '{for(i=1;i<=NF;i++){if($i=="^[0-9]+$"){gsub(".",",",$1); }}}'
于 2012-12-18T10:00:59.377 回答