我有一个包含一些 csv 文件的目录。我想查找包含星期六或星期日日期的文件和行号。日期的格式为 dd.mm.2019。下面的代码正确吗?还有其他方法吗?
grep -n '^5.1.2019|^6.1.2019|^12.1.2019|^13.1.2019|^19.1.2019|^20.1.2
019|^26.1.2019|^27.1.2019|^2.2.2019|^3.2.2019|^9.2.2019|^10.2.2019|^16.2.2019|^17.2.2019|^23.2.2019|^24.2.2019|^2.3.2019|^3.3.2019|^9.3.2019|^10.3.2019|^16.3.2019|^17.3.2019|^23.3.2019|^24.3.2019|^30.3.2019|^31.3.2019|^6.4.2019|^7.4.2019|^13.4.2019|^14.4.2019|^20.4.2019|^21.4.2019|^27.4.2019|^28.4.2019|^4.5.2019|^5.5.2019|^11.5.2019|^12.5.2019|^18.5.2019|^19.5.2019|^25.5.2019|^26.5.2019|^1.6.2019|^2.6.2019|^8.6.2019|^9.6.2019|^15.6.2019|^16.6.2019|^22.6.2019|^23.6.2019|^29.6.2019|^30.6.2019|^6.7.2019|^7.7.2019|^13.7.2019|^14.7.2019|^20.7.2019|^21.7.2019|^27.7.2019|^28.7.2019|^3.8.2019|^4.8.2019|^10.8.2019|^11.8.2019|^17.8.2019|^18.8.2019|^24.8.2019|^25.8.2019|^31.8.2019|^1.9.2019|^7.9.2019|^8.9.2019|^14.9.2019|^15.9.2019|^21.9.2019|^22.9.2019|^28.9.2019|^29.9.2019|^5.10.2019|^6.10.2019|^12.10.2019|^13.10.2019|^19.10.2019|^20.10.2019|^26.10.2019|^27.10.2019|^2.11.2019|^3.11.2019|^9.11.2019|^10.11.2019|^16.11.2019|^17.11.2019|^23.11.2019|^24.11.2019|^30.11.2019|^1.12.2019|^7.12.2019|^8.12.2019|^14.12.2019|^15.12.2019|^21.12.2019|^22.12.2019|^28.12.2019|^29.12.2019$' *.csv
答案1
BEGIN { FS = "," }
{
split($1, a, ".")
timestamp = mktime(sprintf("%.4d %.2d %.2d 00 00 00", a[3], a[2], a[1]))
day = strftime("%u", timestamp)
}
day >= 6
此 GNU awk
(或mawk
)脚本将从第一个逗号分隔字段中以您在问题中指定的格式读取日期。它将将该字段拆分并调用mktime()
以构造与每个读取日期的午夜相对应的 Unix 时间戳值。
然后,它使用strftime()
格式字符串%u
,使函数以 1(星期一)到 7(星期日)之间的十进制整数形式返回工作日。
最后一行测试周末的值,如果测试成功,则打印当前行。如果您只想打印行号,请将其更改为day >= 6 { print FNR }
。
你会像这样运行
$ awk -f script.awk myfile.csv
请注意,此脚本需要 GNUawk
或,或者mawk
这些函数可能不可用。mktime()
strftime()