根据可以位于特定列中任何位置的日期筛选文件



假设我有一个包含两列的文件:

blahblah2020-02-03_moreblah | VALUE |
blah2021-03-04blah | VALUE |

使用awk,我只需要选择第一列中日期小于其他日期的行。令人讨厌的是,日期可能在两边的任何奇怪字符串中,或者根本没有——但它的格式是YYYY-mm-dd。我不知道我是如何陷入不得不使用awk的境地的,但我在这里,我提前非常感谢!

假设:

  • 日期的格式将始终为YYYY-MM-DD(在OP的描述中确认(
  • 任何感兴趣的日期都将只位于第一个|分隔的字段中
  • 第一个字段最多只能包含一个日期字符串(即,不必担心第一个字段包含多个日期字符串(

使用GNU awk 4.0(或更新版本(支持FPAT

awk -v testdt="${dt}" '                                        # pass bash variable "dt" in as awk variable "testdt"
BEGIN { FPAT="[12][0-9]{3}-[012][0-9]-[0123][0-9]"             # define pattern we are looking for; if exists it should be field #1
#       FPAT="[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}"    # one of a few alternatives
}
$1 < testdt                                                    # if we have a match for FPAT and less than testdt then echo entire line to stdout
' input.dat

注意:如果输入的####-##-##格式的数据不是有效日期,则OP可能需要调整FPAT的定义和/或添加更多逻辑,以在运行测试($1 < testdt(之前将匹配验证为实际日期

使用OP的2行样本输入,这里是使用(bash(变量dt:的不同值的一些结果

$ dt='2019-06-01'
$ awk -v testdt="${dt}" 'BEGIN {FPAT="[12][0-9]{3}-[012][0-9]-[0123][0-9]"} $1 < testdt' input.dat
-- no output --
$ dt='2020-06-01'
$ awk -v testdt="${dt}" 'BEGIN {FPAT="[12][0-9]{3}-[012][0-9]-[0123][0-9]"} $1 < testdt' input.dat
blahblah2020-02-03_moreblah | VALUE |
$ dt='2021-06-01'
$ awk -v testdt="${dt}" 'BEGIN {FPAT="[12][0-9]{3}-[012][0-9]-[0123][0-9]"} $1 < testdt' input.dat
blahblah2020-02-03_moreblah | VALUE |
blah2021-03-04blah | VALUE |

使用任何awk,在任何shell中,在每个Unix框上:

$ awk -v tgt='2020-05-01' 'match($0,/[0-9]{4}(-[0-9]{2}){2}/) && (substr($0,RSTART,RLENGTH) < tgt)' file
blahblah2020-02-03_moreblah | VALUE |
$ awk -v tgt='2021-05-01' 'match($0,/[0-9]{4}(-[0-9]{2}){2}/) && (substr($0,RSTART,RLENGTH) < tgt)' file
blahblah2020-02-03_moreblah | VALUE |
blah2021-03-04blah | VALUE |

\d\d\d\d-\d\d-\dhttps://regexone.com/它有效,但有更好的解决方案如果你不想要它,通常用pyhton用这个regex语法写一个脚本,收集所有日期,然后根据之前的位置进行筛选——无论是大于还是小于你的日期。对于范围日期中的i:如果date[i]<正则表达式

相关内容

最新更新