awk程序中的带前导零

awk程序中的带前导零,awk,Awk,所以我很迷茫,因为我错过了一个星期,正在追赶,但我要写一个awk程序,以天为单位来区分两个日期之间的差异 我差不多已经完成了,但是如果用户在执行数据验证时输入01/01/YYYY,它就不喜欢了。我从参数中取出3个字段,然后将它们传递给一个函数进行验证 给我带来麻烦的是,在我的验证中: if ( day > Days[month] ){ invalid stuff here } 其中,Days[]是一个数组,包含[1]=31、[2]=28(如果是leap,则为29)等 由于未定义天数[01

所以我很迷茫,因为我错过了一个星期,正在追赶,但我要写一个awk程序,以天为单位来区分两个日期之间的差异

我差不多已经完成了,但是如果用户在执行数据验证时输入01/01/YYYY,它就不喜欢了。我从参数中取出3个字段,然后将它们传递给一个函数进行验证

给我带来麻烦的是,在我的验证中:

if ( day > Days[month] ){
invalid stuff here
}
其中,
Days[]
是一个数组,包含[1]=31、[2]=28(如果是leap,则为29)等

由于未定义天数[01],因此该值为true。我可以将[01]定义为与[1]相同,但我更喜欢更优雅的东西

如何在awk程序中去掉可变月份的前导零?我发现的所有东西都是用于shell脚本并调用awk的,但这并没有真正帮助我


谢谢你的帮助

假设变量名为
month
,则需要此变量:

gsub ("^0*", "", month);
^
是起始锚点,
0*
表示零个或多个
0
字符。因此,这将有效地删除变量开头的所有
0
字符

举例来说(这也展示了一种对中间数字进行分割的方法,在分割日期之前,请参见第二个
gsub
):

另一种选择:

$ echo 01234 | awk '{x=$0+0;print x}'
1234

对不起。我的答案不是关于awk,而是关于bash本身。所以请不要给我的评论打负号)

或使用(())符号执行整数计算

echo $((0000))

我尝试了@paxdiablo建议的答案。它最后也去掉了非前导零

$ echo '20/02/1965' | awk '{gsub ("^0*", "", $0); gsub ("/0*", "/", $0); print}'
2/2/1965
使用
sub
代替
gsub
对我来说效果很好

$ echo '20/02/1965' | awk '{sub ("^0*", "", $0); sub ("/0*", "/", $0); print}' 
20/2/1965

最近的贡献有点缩短

echo '20/02/1965' | awk '{sub ("/0", "/", $0)}1'
20/2/1965

我仍然在绕着正则表达式转,但这实际上是在说“从一开始就开始,匹配0后跟任何其他内容,只替换完全匹配的内容而不替换任何内容”吗?无论哪种方式,它都完全符合我的要求。非常感谢。@Dirgon,很接近,但不是很接近<代码>*没有任何意义,它表示前面的“东西”中的0个或多个。换句话说,
^0*
将匹配字符串开头的任意数量的0(包括无)。@MadCalm:如果您阅读问题,输入值的范围是
1、2、…、12
,则不可能是月号
0
。如果这是一个更一般化的问题(一个想要处理
0
),我会满足它。在awk中,通过添加0将+1强制转换为数值是最正确的方法。这非常非常简单为什么不在Perl、agol和其他不相关的语言中给出一个示例?OP显然是在用awk编写一个程序……我不懂Perl,在我看来Perl对于这个问题来说更遥远。通常sed/awk一起使用。所以我认为这些信息是有用的
$ echo '20/02/1965' | awk '{sub ("^0*", "", $0); sub ("/0*", "/", $0); print}' 
20/2/1965
echo '20/02/1965' | awk '{sub ("/0", "/", $0)}1'
20/2/1965