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


9

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

我应该怎么做?


如果文件有2列或更多列,则要插入或替换第二列?
ctac_

只需在第一列之后插入一列
pkaramol

2
好的,因此要插入,必须使用:awk'BEGIN {FS = OFS =“,”} {$ 1 = $ 1“,\” 2.4.0 \“”}
1'– ctac_

1
或awk'{sub(“,”,“,\” 2.4.0 \“,”)}
1'– ctac_

Answers:


12

您似乎把引号弄错了。您需要执行以下操作

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

这在GNU awk手册页中进行了解释-3.2转义序列

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


就我能理解该行为的原因而言,awk似乎已被解释2.4.0为一个数字单词,并带有OP中的多余引号,并决定在第一个点之后失去精度。

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

变得公正

$2=""2.4.0""

awk不再理解为一个字符串。您可以通过简单地重做此行为

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

当你做的时候碰巧是结果

awk 'BEGIN { print 2.4.0 + 0 }'

1
@roaima:据我所知,它似乎刚刚被取消,只是导致{ print 2.4.0 }or { print 2.4.0 + 0 },即作为非字符串组成部分。我试着来回搜索相关的文档太多,但不能
Inian

2
另一种方便地添加我有时使用的引号的方法是定义一个变量,例如:awk -v q='"' '... print q "2.4.0" q ...
Thor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.