文本处理到 select 日期范围

text processing to select date range

我有以下输入,我想 select 行的日期从现在到 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

一种方式:

awk '{split(,a,"/");split(,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(,a,"/") => 在/的基础上拆分第2列存入数组a

split(,b,":") => 在:的基础上拆分第3列存入数组b

mktime => 以秒为单位给出时间

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

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

这是一个使用 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

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

awk '{split(,a,"/");split(,b,":"); print ,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