首页 > 解决方案 > awk 根据日期验证过滤数组中的值,如果在 START 和 END 处与文本匹配,则打印正确的输出,包括匹配

问题描述

嗨,我正在尝试解决这个问题,其中我有 file1,其中列号 $6 包含 YYYYMMDD 格式的时间戳,如果 7 天以上,则与当前日期进行比较,这是可行的,但是一旦我想根据定义的数组中的 ID 过滤它在打印输出中,它还将打印前缀“START”“END”,我只想为有效 ID 使用它,而不是为给定数组中的所有 ID 打印我

案例:我有这个数组,我在 bash 脚本中循环

ARR[AB25645R874]="VAL1"
ARR[AB25320R874]="VAL2"
ARR[AB25276R874]="VAL3"
ARR[AB25172R874]="VAL4"
ARR[AB25173R874]="VAL5"
ARR[AB25048R874]="VAL6"
ARR[AB25060R874]="VAL7"

awk -v d="$(date --date="7 days ago" "+%Y%m%d")"  '($6)  < d' file1 | \
awk -v i="$ID" '{$1=$1};BEGIN{print "START"}{if (/'${ID}'/){print $0 }}END{print "END"}'

其中 ID 由数组表示,例如。文件 1 中的 25172

输入:文件1

A B 25645 FX M.1 20200514
A B 25645 FX M.1 20200514
A B 25645 FX M.1 20200514
A B 25645 FX M.1 20200514
A B 25645 FX M.1 20200514
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200421
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200423
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25172 FX M.1 20200421
A B 25173 FX M.1 20200427
A B 25173 FX M.1 20200504
A B 25173 FX M.1 20200429
A B 25048 FX M.1 20200512
A B 25048 FX M.1 20200512
A B 25048 FX M.1 20200512
A B 25048 FX M.1 20200512
A B 25048 FX M.1 20200512
A B 25060 FX M.1 20200421

它的打印出来:

START
END
START
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
END
START
END
START
A B 25060 FX M.1 20200421
END
START
A B 25172 FX M.1 20200421
END
START
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200421
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200423
END
START
A B 25173 FX M.1 20200427
A B 25173 FX M.1 20200504
A B 25173 FX M.1 20200429
END

实际上 ID:这两个 ID 的时间戳:25048 25645 无效,因为它不是 7 天大,所以它应该只打印预期的输出:

START
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
END
START
A B 25060 FX M.1 20200421
END
START
A B 25172 FX M.1 20200421
END
START
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200421
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200423
END
START
A B 25173 FX M.1 20200427
A B 25173 FX M.1 20200504
A B 25173 FX M.1 20200429
END

我仍然无法处理这个正确过滤的技巧,任何如何更好的提示将不胜感激,谢谢

标签: arraysbashdateawkfiltering

解决方案


awk -v d="$(date --date="7 days ago" "+%Y%m%d")" 'BEGIN{ i=999999 }$6 < d && i >=$3{ if(i>$3){ if (i!=999999) print "END"; print "START" }; print $0; i=$3 }END{ print "END"}' file1

输出:

START
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200421
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200423
END
START
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
END
START
A B 25172 FX M.1 20200421
END
START
A B 25060 FX M.1 20200421
END

推荐阅读