【问题标题】:text processing to select date range文本处理以选择日期范围
【发布时间】:2017-12-27 13:22:52
【问题描述】:

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

【问题讨论】:

  • 绝对不是 sed。你尝试过什么,你在哪里卡住了?
  • now 日期总是最后一行吗?
  • 我正在尝试使用 Guru 的 AIX 解决方案,我正在尝试计算纪元时间,因为 AIX awk 不支持 mktime,但是我没有得到任何公式来将给定日期转换为纪元比较时间
  • 使用 Python 或 Perl 等其他脚本语言可能更容易。
  • 我可以使用 perl 计算纪元时间,并用它与当前纪元时间进行比较。我正在尝试拆分第 2 列和第 3 列以获得 $sec,$min,$hour,$mday$month$year, 所以可以使用 perl -e 'use Time::Local; 计算纪元时间打印时间gm(56,3,9,27,07-1,2017), "\n";'

标签: date awk sed aix text-processing


【解决方案1】:

一种方式:

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,"/") => 在/的基础上拆分第2列并存入数组a中

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

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

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

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

【讨论】:

  • mktime 和 systime 在 AIX 中不受支持的日期函数,我正在尝试将时间解释为 epoch 进行比较。仍然卡住
  • 试图将日期转换为纪元时间以与日期 +%s 进行比较,但是我没有得到任何数学公式来这样做,因为 AIX 不支持 date -d ' ' +%s
【解决方案2】:

这是使用 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 不支持 date -d
  • @Sid 尝试删除-d
  • 日期:0551-402 日期/时间规范中的无效字符
  • date: 0551-003 您必须是 root 或授权用户才能更改日期。收到此错误
【解决方案3】:

这很好用,如果有人有其他更简单的 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

【讨论】:

  • 如果您可以使用 perl,那么只需在 perl 中完成所有操作。如果你创建一个问题并用 perl 标记它,我相信你会得到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多