通过用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