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

时间:2015-08-17 20:57:53

标签: 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

1 个答案:

答案 0 :(得分:2)

<dialog>

编辑

正如评论中所指出的,更强大的解决方案可能是检查字段是否可以转换为数字并且仅在不包含引号的情况下包围:

$ 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 } 将被引号括起来,而在第二个解决方案中则不会。相反,在第一个解决方案中0x0A 被引号括起来,但在第二个解决方案中它将是。

根据您的数据,这可能无关紧要,但第二种解决方案更适合。