Shell脚本适配:按表名+日期分组获取最大后缀文件
解决Shell脚本按表名+日期分组取最大后缀文件的问题
需求说明
遍历目录中文件名格式为tablename_14位日期_nn的文件,按表名+日期的组合分组,返回每组中后缀数字nn最大的文件。
示例文件
firsttable_20230112093000_1 firsttable_20230112093000_2 firsttable_20230112093000_3 firsttable_20230112093000_4 firsttable_19990202090000_1 firsttable_19990202090000_2 secondtable_20220112090000_1 secondtable_20220112090000_2 secondtable_20220112090000_3
期望结果
firsttable_20230112093000_4 firsttable_19990202090000_2 secondtable_20220112090000_3
问题分析
原脚本仅按表名作为分组依据,忽略了同表名不同日期的情况,导致部分分组结果被遗漏。
解决方案
不需要复杂正则,利用文件名固定的下划线分隔格式,用awk就能高效实现分组统计:
基础版脚本(当前目录)
ls | awk -F'_' '{ key = $1 "_" $2 if ($3 > max[key]) { max[key] = $3 file[key] = $0 } } END { for (k in file) print file[k] }'
进阶版(指定目录+格式校验)
如果需要遍历指定目录,同时过滤不符合tablename_14位日期_nn格式的文件,可以用:
find /目标目录路径 -type f | awk -F'_' ' length($2) == 14 && $3 ~ /^[0-9]+$/ { key = $1 "_" $2 if ($3 > max[key]) { max[key] = $3 file[key] = $0 } } END { for (k in file) print file[k] }'
脚本解释
-F'_':把文件名按下划线拆分为3个字段,分别对应表名、14位日期、后缀数字key = $1 "_" $2:用「表名+日期」作为唯一分组标识- 遍历每个文件时,对比当前后缀数字和该分组已记录的最大值,更新最大值和对应文件名
- 最后遍历所有分组,输出每组的目标文件
内容的提问来源于stack exchange,提问作者rpg
相关产品推荐
相关产品推荐

