Bash

兩個日期之間的文件子集,當某些日期無效時

  • March 3, 2022

我遇到了幾個類似的問題,但解決方案似乎讓我失望了,我相信這是因為我的文件中有一些垃圾數據破壞了我按時間戳過濾的嘗試。

這是一個範例文件:

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

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

引用自:https://unix.stackexchange.com/questions/692825