使用 grep/sort/find 提取唯一值

使用 grep/sort/find 提取唯一值

我有一堆以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。

相关内容