当某些日期无效时,两个日期之间的文件子集

当某些日期无效时,两个日期之间的文件子集

我遇到过几个类似的问题,但解决方案似乎让我失败,我相信这是因为我的文件中有一些垃圾数据破坏了我按时间戳过滤的尝试。

这是一个示例文件:

2020-12-12 12:10:00,3,4,2
2020-12-12 12:11:00,4,3,2
2020-12-12 12:12:00,4,3,2
2020-12-12 12:13:00,4,3,2
20-12-12 12:14:00,4,3,2
4,3,2
2020-12-12 12:16:00,4,3,1
-12-12 12:17:00,4,3,2
2020-12-12 12:18:00,5,3,2

我想过滤这个文件,创建一个仅包含有效时间戳的新文件(每行都应该以有效的时间戳开头)。

BegDate="2020-12-12 12:11:00"
EndDate="2020-12-12 12:16:00"

我尝试过使用 sed

TimeWindow=$(sed -rne '/'$BegDate'/,/'$EndDate'/p' $MyFile)
echo $TimeWindow > NewFile.csv

和 awk

awk -v from=$BegTime -v to=$EndTime '$1>=from && $1<=to' "$MyFile" > "NewFile.csv"

但两者都失败了

“NewFile.csv”的期望结果是

2020-12-12 12:11:00,4,3,2
2020-12-12 12:12:00,4,3,2
2020-12-12 12:13:00,4,3,2
2020-12-12 12:16:00,4,3,1

答案1

您还可以awk通过检查第一个字段是否遵循有效的日期格式来改进您的方法。

LC_ALL=C awk -F, -v from="$BegTime" -v to="$EndTime" '
  BEGIN {valid = "^" from "$"; gsub("[0-9]", "[0-9]", valid)}
  $1 ~ valid && $1 >= from && $1 <= to'

上面用于验证日期的正则表达式是$BegTime通过将其中的数字替换为[0-9](在 C 语言环境中与 相同[0123456789])并^在开头和$结尾处添加以在开头和结尾处锚定来构建的。

如果您还想排除无效日期(例如 9999-99-99 99:99:99 或 2022-02-29 00:00:00),则可以优化正则表达式。

确保引用所有 shell 参数扩展(请参阅您的代码如何与以下示例之一匹配:忘记在 bash/POSIX shell 中引用变量的安全隐患)。另请注意您的问题中BegTime和之间的差异。BegDate

相关内容