如何使用awk或perl对yyyymmdd格式日期文件排序并提取最新最旧各1万行
解决方案
前置说明
- 你的日期存储格式为
yyyymmdd,其字符串排序/数值排序结果和时间先后顺序完全一致,无需额外拆分日期字段做比较,是方案可以做到简洁的核心前提
awk实现方案
方案1:纯gawk实现(适合内存足够的场景)
依赖gawk的asort排序函数,目前主流Linux发行版默认的awk均为gawk,可直接使用:
awk '{a[NR] = $0} END { total = asort(a); # 升序排序,排序后a[1]为最早日期,a[total]为最晚日期 # 输出最旧的1万行 for(i=1; i<=10000; i++) print a[i] > "oldest_1w.txt"; # 输出最新的1万行 for(i = total - 9999; i <= total; i++) print a[i] > "newest_1w.txt"; }' 你的日期文件路径.txt
方案2:结合系统sort(适合超大文件,内存占用更低)
利用系统sort做外部排序性能更高,awk只需流式处理不需要全量加载数据:
sort 你的日期文件路径.txt | awk ' # 前1万行直接写入最旧文件 NR <= 10000 {print > "oldest_1w.txt"} # 用滑动窗口仅保存最新的1万行,不用全量存 {buf[NR % 10000] = $0} END { for(i = 0; i < 10000; i++) print buf[(NR + i) % 10000] > "newest_1w.txt" }'
Perl单行实现方案
无需复杂的自定义排序逻辑,直接利用字符串排序特性即可:
perl -e ' chomp(@dates = <>); @sorted = sort @dates; # 写入最旧1万行 open F, ">", "oldest_1w.txt" and print F join "\n", @sorted[0..9999], "\n"; # 写入最新1万行 open F, ">", "newest_1w.txt" and print F join "\n", @sorted[-10000..-1], "\n"; ' 你的日期文件路径.txt
内容的提问来源于stack exchange,提问作者pesaw
相关产品推荐
相关产品推荐

