将文件排序 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 _
将下划线设置为分隔符,但是如果我没有明确告诉它 使用 一个关键字段,排序也会在我的实现中忽略它.
组合强制 V0
与 V01
和 V02
进行比较,而无需将下划线与点进行比较,因此您可以获得所需的顺序。
非常感谢您的帮助。
我有文件:
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 _
将下划线设置为分隔符,但是如果我没有明确告诉它 使用 一个关键字段,排序也会在我的实现中忽略它.
组合强制 V0
与 V01
和 V02
进行比较,而无需将下划线与点进行比较,因此您可以获得所需的顺序。