我有一堆以YYYYMMDD.Txt
格式命名的文本文件(所以今天是20160420.Txt
)。
每个文件基本上都是一个日志,其中包含时间戳和唯一 ID,每个值均由制表符分隔符分隔。
例如,20160420.Txt
具有以下值:
DATE TIME ID
20160420 0135 123456
20160420 0240 234567
20160420 1252 345678
我需要提取这些文件中存在的所有唯一 ID,但仅限于过去 6 个月的这些文件。
问题是我无法使用 mtime,因为所有文件都在过去一周重新创建(即:mtime 与文件名不对应)。
有什么办法可以用grep
/ find
/做到这一点吗sort
?
答案1
找到 6 个月前的确切日期并不是一件容易的事,特别是如果当前日期是某个月的 31 号。但是,如果您知道如何使用find
和执行此操作-mtime
,我只需根据文件名称中的日期来触摸文件即可:
for x in *.Txt; do
dd=${x%.Txt}
touch -t "$dd"0000 "$x"
done
然后使用mtime
答案2
使用awk做这项工作,并且SQLite对于日期。
sqlite3 <<< "select date('2016-04-20', '-6 month');"
2015-10-20
丹迪,不是吗? awk 有字符串函数来插入/删除 SQLite 需要的连字符,是的,还有制表符分隔符上的分割。
awk 'NR == 1 {next}; { IDS[$3]++ }; END {for (K in IDS) {print K}}' ids
123456
345678
234567
也保证快。
答案3
跟进 @cas 对另一个答案的评论:
six_months=$(date -d "6 months ago" "+%Y%m%d")
for f in *.Txt; do
file_date=${f%.Txt}
[[ $file_date > $six_months ]] && echo "$f"
done |
xargs awk 'FNR > 1 {print $3}' |
sort -u > unique_ids_in_last_6_months
for 循环打印出“合格”的文件名。 xargs 一次将文件名批量传递给 awk(最大限度地减少对 awk 的调用次数)。 awk 丢弃标题并打印最后一列。 sort 为您找到唯一的 ID。