将文件排序 bash

Sorting files in bash

非常感谢您的帮助。

我有文件:

V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.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
V1__file_g.sql

我想使用 sort 命令以接下来的方式对它们进行排序

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

标记 -n-g 对我没有帮助。

解决这个问题我似乎伤透了脑筋

有人可以帮忙吗?

谢谢!

-k 选项接受一个关键定义参数,您可以将其与 -t _ 一起使用,以使用下划线作为字段分隔符:

> sort -t _ -k 1,2 data.txt 
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

对于此数据集,仅对第一个字段进行排序。

$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -t _ -k 1,1
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql

使用 -k 1,2 对我来说也失败了,除非我使用字典排序 (-d)。

$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -t _ -k 1,2
V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.sql

但适用于 -d

$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -d -t _ -k 1,2
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql

字典排序将“仅考虑空格和字母数字字符”,因此点和下划线将被忽略,使所有文件名成为单个字母数字字符串,数字 字符排序为顶部。

-d 单独使用仍然失败 - 您需要 建立字段。

$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -d
V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.sql

使用 -t _ 将下划线设置为分隔符,但是如果我没有明确告诉它 使用 一个关键字段,排序也会在我的实现中忽略它.

组合强制 V0V01V02 进行比较,而无需将下划线与点进行比较,因此您可以获得所需的顺序。