通过用awk减去现有数字来添加一个数字

通过用awk减去现有数字来添加一个数字,awk,Awk,我想转换 Title Page/4,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0 Contents/16,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0 到 规则是将/后面的数字减去3,然后将结果加在/前面 我试着用awk来做这件事 awk -F',/' '{gsub(/\//, ($2-10) + "\/"}' myf

我想转换

Title Page/4,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0                  
Contents/16,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0                   

规则是将
/
后面的数字减去3,然后将结果加在
/
前面

我试着用
awk
来做这件事

awk -F',/' '{gsub(/\//, ($2-10) + "\/"}' myfile

但它不起作用。为什么?谢谢。

对您的尝试稍加修改即可产生所需的输出:

$ awk -F'[,/]' '{sub(/\//, " " ($2-3) "/") }1' file
Title Page 1/4,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0                  
Contents 13/16,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0 
-F
用于指定输入字段分隔符。我已将其更改为与逗号和斜杠匹配的正则表达式组,这意味着第二个字段
$2
包含您试图替换的数字。由于您只对每条记录进行一次替换感兴趣,因此我使用了
sub
而不是
gsub
。注意,在awk中,字符串是自动连接的(您不应该使用
+


Awk程序的结构类似于
条件{action}
。如果未指定任何条件,则始终运行操作块。如果未指定任何操作,则默认操作为打印记录的
{print}
。在上面的脚本中,
1
用于打印记录,因为它是计算结果为true的最简单表达式。

-F'[,/]'
而不是
-F',/'
是因为
[]
表示或?awk是否遵循一些正则表达式或wildchars的约定?@Tim这是一个正则表达式字符范围“结尾的1总是计算为true,因此awk执行默认操作”。
1
是什么东西的捷径吗?什么是完整的?@Tim这正是那句话所说的
1
是awk中的truth-y值,所有truth-y模式都会运行各自的操作块。未指定操作块时,默认操作块为
{print}
。所以
1
相当于
1{print}
。类似地,默认模式是一个真值,因此
{print$2}
(或其他)等同于
1{print$2}
。(基于另一个SO用户,我开始使用
7
而不是
1
,因为它更突出,看起来也没那么神奇。)@Etan:gsub操作和
打印
操作之间应该有标点符号吗?e、 g.
awk-F'[,/]'{gsub(/\/,“($2-3)”/”);1'文件
$ awk -F'[,/]' '{sub(/\//, " " ($2-3) "/") }1' file
Title Page 1/4,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0                  
Contents 13/16,Black,notBold,notItalic,open,TopLeftZoom,0,0,0.0