AWK-仅过滤文本文件中具有特定格式的日期

时间:2019-03-02 17:29:40

标签: bash macos awk

在macOS上,我有一个.txt文件,其中包含多行文本。我只想过滤日期,并将它们按出现顺序逐行保存在新的文本文件中。

但是,我对所有日期都不感兴趣,仅对看起来像02/03/2019的那些完整日期以及少于13天的日期感兴趣。 e。 01 ... 12。

然后,我想删除日期和月份的数字相同的日期,例如01/01/2019和02/02/2019等。

如何使用awk或bash中的类似软件来实现这一目标?

2 个答案:

答案 0 :(得分:2)

如果选择perl:

perl -ne 'print if m:(\d\d)/(\d\d)/(\d\d\d\d): && $1 < 13 && $1 != $2' dates.txt >newdates.txt

这假定为这种格式/dd/mm/yyyy

请注意,我使用m: :表示法而不是通常的/ /来进行正则表达式匹配。因此,我不需要在日期中转义/斜杠。

答案 1 :(得分:1)

删除文本文件中的日期

以下命令将删除格式为 aa/bb/cccc的所有日期,其中aa = bb <13。原始文件将被复制到{{ 1}}作为备份,带有删除日期的新文本将覆盖旧文件。

yourFile.txt.bak

如果您想插入一些内容而不只是删除日期,则可以通过在两个sed -E -i.bak 's:\b(0[0-9]|1[0-2])/\1/[0-9]{4}\b::g' yourFile.txt 之间写入替换内容来实现。例如,::将每个匹配的日期替换为文本sed … 's:…:deleted date:/g' …

✱请注意,日期格式是deleted date还是dd/mm/yyyy对您的标准来说都没有关系,因为您只对mm/dd/yyyy和{{1 }}相等。

从文本文件中提取特定日期

如果您不想删除,而只提取注释中提到的特定日期,则可以使用以下命令。

dd

这将以 mm(!)格式提取所有日期,其中grep -Eo '\b([0-9]{2}/){2}[0-9]{4}\b' yourFile.txt | awk -F/ '$1<13 && $1!=$2' dd/mm/yyyy <13。日期按出现在stdin上的顺序打印。如果要将它们保存到文件中,请在命令末尾附加mm