3

所以我很迷茫,因为我错过了一周并且正在追赶,但我要编写一个 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,但这并没有真正帮助我。

谢谢您的帮助!

4

5 回答 5

9

另外一个选项:

$ echo 01234 | awk '{x=$0+0;print x}'
1234
于 2013-03-20T05:39:55.883 回答
6

你需要这个,假设你的变量被调用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
于 2013-03-20T05:18:54.570 回答
2

我尝试了@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
于 2015-07-22T12:35:46.140 回答
0

最新的贡献有所缩短。

echo '20/02/1965' | awk '{sub ("/0", "/", $0)}1'
20/2/1965
于 2015-07-22T16:43:32.607 回答
-1

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

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

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

echo $((0000))
于 2014-04-18T16:13:17.637 回答