在awk程序中删除前导零

时间:2013-03-20 05:17:35

标签: awk

所以我很失落,因为我错过了一个星期并且正在追赶,但是我要写一个awk程序来分辨两个日期之间的差异。

我或多或少已经完成了它,但如果用户在进行数据验证时输入01/01 / YYYY则不喜欢它。我将3个字段从arg中拉出来,然后将它们传递给函数进行验证。

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

if ( day > Days[month] ){
invalid stuff here
}

其中Days[]是一个数组,其中[1] = 31,[2] = 28(如果是跳跃则为29)等。

它命中,因为没有定义Days [01]。我可以通过将[01]定义为与[1]相同而我可以绕过它,但我宁愿更优雅。

如何在awk程序中删除变量月份的前导零?我发现的所有内容都是在shell脚本中使用并调用awk,但这对我没有帮助。

感谢您的帮助!

5 个答案:

答案 0 :(得分:7)

另一种选择:

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

答案 1 :(得分:5)

你需要这个,假设你的变量叫month

gsub ("^0*", "", month);

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

作为示例(也显示了对中间数字执行此操作的方法,在将日期拆分之前,请参阅第二个gsub

pax> echo '1/1/2013
03/12/2014
02/02/1965' | awk '{gsub ("^0*", "", $0); gsub ("/0*", "/", $0); print}'

1/1/2013
3/12/2014
2/2/1965

答案 2 :(得分:1)

我尝试了@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

答案 3 :(得分:0)

对不起我的回答不是关于awk,而是关于bash本身。所以请不要给我的评论减去)

echo -e "00000000" | sed -r 's/^[0]*$/0/g' | sed -r 's/^0[0]+//g'

或使用(())表示法执行整数计算

echo $((0000))

答案 4 :(得分:0)

最近的贡献有所缩短。

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