awk 意外地从字符串中删除了点

pka*_*mol 9 awk csv

我想在文件中添加一列(第二位),.csv并且我希望该列的值是字符串并被引用;

以下命令确实添加了列,但没有引号:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

以下方法确实包含引号,但出于某种原因,它.从值中删除了最后一个(点)

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

所以我的价值观最终是“2.40”。

我应该怎么做?

Ini*_*ian 12

你似乎把引号弄错了。你需要做如下

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

这在GNU awk 手册页中进行了解释- 3.2 Escape Sequences

某些字符不能直接包含在字符串常量("foo")或正则表达式常量 ( /foo/) 中。相反,它们应该用转义序列表示,转义序列是以反斜杠 ( \)开头的字符序列。转义序列的一种用途是在字符串常量中包含双引号字符。因为纯双引号结束字符串,所以您必须使用\"将实际双引号字符表示为字符串的一部分。


至于我可以理解行为原因的原因,awk似乎已将其解释2.4.0为带有 OP 额外引号的数字单词,并决定在第一个点之后失去精度。

IE

$2="\""2.4.0"\""
Run Code Online (Sandbox Code Playgroud)

变得公正

$2=""2.4.0""
Run Code Online (Sandbox Code Playgroud)

awk不再理解为一个字符串。您只需执行以下操作即可重现此行为

awk 'BEGIN { print ""2.4.0"" }'
2.40
Run Code Online (Sandbox Code Playgroud)

这恰好是你做的结果

awk 'BEGIN { print 2.4.0 + 0 }'
Run Code Online (Sandbox Code Playgroud)

  • 我有时使用的另一种方便地添加引号的方法是定义一个变量,例如:`awk -vq='"' '... print q "2.4.0" q ...` (2认同)