我想在文件中添加一列(第二位),.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)