1

awk スクリプトを実行すると構文エラーが発生します。スクリプトは次のとおりです。

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

実際のデータがどのように見えるかのサンプルは次のとおりです (囲まれ、パイプで区切られています):

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

コードからわかるように、私がやりたいことは次のとおりです。すべてのフィールドを読み取り、フィールドが数値(常に10進数)の場合は、ポイントをコンマに置き換えます。また、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

for の前に中括弧がありません。このように試すことができます

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