文本处理以选择日期范围

时间:2017-07-21 13:08:58

标签: date awk sed aix text-processing

我有以下输入,我想选择从现在到2周或3周的日期等等。

0029L5 08/19/2017 00:57:33
0182L5 08/19/2017 05:53:57
0183L5 02/17/2018 00:00:16
0091L5 10/19/2022 00:00:04
0045L5 07/27/2017 09:03:56
0059L5 08/14/2017 00:51:50
0100L5 08/20/2017 01:25:39
0111L5 08/21/2017 00:46:15
0128L5 08/21/2017 12:38:51
D00054 07/21/2017 09:01:19

所以如果我想从现在开始想要2个星期就可以获得所需的输出

0045L5 07/27/2017 09:03:56
D00054 07/21/2017 09:01:19

但如果我想说4周,那么输出应该是

0045L5 07/27/2017 09:03:56
0059L5 08/14/2017 00:51:50
D00054 07/21/2017 09:01:19

3 个答案:

答案 0 :(得分:0)

一种方式:

awk '{split($2,a,"/");split($3,b,":"); x=mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3]);y=systime();}x>y && x<(y+(n*7*24*60*60))' n=2 file

其中n表示周数

split($2,a,"/") =&gt;在/的基础上拆分第二列并存储在数组a

split($3,b,":") =&gt;在:的基础上拆分第3列并存储在数组b

mktime =&gt;以秒为单位给出时间

x包含文件中的时间(以秒为单位)

y包含以秒为单位的当前时间

答案 1 :(得分:0)

以下是一个使用bash的解决方案,其中file是您文件的名称:

while read r; do dd=$(($(date -d "${r:6}" +%s) - $(date +%s))); echo $(($dd/(3600*24))); done < file

这将计算${r:6}(当前行的子字符串)和今天的日期$(date +%s)中的日期之间的日期差异,并将其转换为天数。

仅输出日期差异小于2周(1209600秒)的行

while read r; do dd=$(($(date -d "${r:6}" +%s) - $(date +%s)));  if [ "$dd" -lt 1209600 ]; then echo $r; fi; done < file

答案 2 :(得分:0)

这很好用,如果有人有任何其他更简单的AIX解决方案,请让我知道。

awk '{split($2,a,"/");split($3,b,":"); print $1,b[3],b[2],b[1],a[2],a[1],a[3]}' /tmp/TLD_1 | head -10 | while read media sec min hour day mon year;  do month=$((10#$mon-1)); expiry=$(perl -e 'use Time::Local; print timegm(@ARGV[0,1,2,3], $ARGV[4], $ARGV[5]), "\n";' $sec $min $hour $day $month $year); current=$(date +%s); twoweeks=$(($current + (2*7*24*60*60))); if [ "$expiry" -gt "$current" -a "$expiry" -lt "$twoweeks" ]; then echo "$media $mon/$day/$year $hour:$min:$sec"; fi; done