文本处理到 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
我有以下输入,我想 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