如何使用bash的sort命令按指定版本规则排序SQL文件
解决方案
你需要的排序规则刚好匹配版本号排序逻辑,以下是两种实现方法:
方法1:使用GNU sort的版本排序参数(推荐)
GNU实现的sort自带-V(--version-sort)参数,专门用于自然排序版本号,无需额外处理即可直接符合你的需求:
ls *.sql | sort -V
执行后输出顺序完全匹配你要求的结果:
V0__file_c.sql V0.1__file_a.sql V0.2__file_b.sql V1__file_g.sql V1.1__file_a.sql V1.2__b.sql V1.3__c.sql V1.4__d.sql V1.5__e.sql V1.6__f.sql
方法2:兼容非GNU环境的多键排序
如果你的系统是BSD等不带-V参数的环境,可以通过字段拆分+多键排序实现:
ls *.sql | awk -F'[._]' '{print $1, (NF>2 ? $2 : 0), $0}' | sort -k1.2n -k2n | cut -d' ' -f3-
命令逻辑说明:
- 用
awk拆分文件名,主版本号取V之后到第一个分隔符(.或_)的部分,无次版本号时默认次版本号为0,将这两个排序键拼接在原文件名前 - 用
sort先按主版本号数值排序,再按次版本号数值排序 - 最后用
cut去掉临时拼接的排序键,输出原文件名
内容的提问来源于stack exchange,提问作者Roman R.
相关产品推荐
相关产品推荐

