包含非数字字符的awk引号字段

包含非数字字符的awk引号字段,awk,pattern-matching,Awk,Pattern Matching,我希望在文件中带有非数字字符的分隔文件中的字段周围加引号,并删除字段中的任何内部双引号 例如: 0.010|hel"l&0|w#rld'|201 0.301|s@yin%"|t^h!at|5.0 0.010|"hell&0"|"w#rld'"|201 0.301|"s@yin%"|"t^h!at"|5.0 应导致: $cat del.awk 开始{FS=OFS=“|”} { 对于(i=1;iYou也可以编写if($i!=$i+0)来区分数字和非数字。谢谢,@glenn

我希望在文件中带有非数字字符的分隔文件中的字段周围加引号,并删除字段中的任何内部双引号

例如:

 0.010|hel"l&0|w#rld'|201
 0.301|s@yin%"|t^h!at|5.0
 0.010|"hell&0"|"w#rld'"|201
 0.301|"s@yin%"|"t^h!at"|5.0
应导致:

$cat del.awk
开始{FS=OFS=“|”}
{

对于(i=1;iYou也可以编写
if($i!=$i+0)
来区分数字和非数字。谢谢,@glennjackman,我非常喜欢这个想法。我更新了答案,建议它可能是一个更可靠的选择。在CSV字段中引用内部引号的方法是将它们加倍:
hel“l&0
=>
“hel”“l&0”
()
$ cat del.awk
BEGIN { FS=OFS="|" }

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

$ awk -f del.awk file.txt
0.010|"hell&0"|"w#rld'"|201
0.301|"s@yin%"|"t^h!at"|5.0
BEGIN { FS=OFS="|" }

{
  for (i=1; i<=NF; ++i) {        
    if ($i != $i + 0) {
      # the field could not be converted into a number
      gsub("\"","", $i);
      $i = "\"" $i "\""
    }
  }
  print
}