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

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

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

以下命令会添加列但不带引号:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

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

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

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

我该怎么办?

答案1

你似乎把引号弄错了。你需要按如下操作

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

这在GNU awk 手册页 - 3.2 转义序列

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


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

IE

$2="\""2.4.0"\""

变得只是

$2=""2.4.0""

awk不再被理解为字符串。您可以通过简单地执行以下操作来重现此行为

awk 'BEGIN { print ""2.4.0"" }'
2.40

当你这样做时,结果恰好是这样

awk 'BEGIN { print 2.4.0 + 0 }'

相关内容