Tôi sẽ - như tôi thường làm - đề nghị perl
.
perl
có một chức năng sắp xếp cho phép bạn chỉ định một chức năng so sánh. Chức năng so sánh này là bất kỳ bài kiểm tra đó có hai giá trị, và trở lại -1
, 0
hoặc 1
tùy thuộc vào vị trí tương đối.
Nó lặp lại danh sách thiết lập từng giá trị $a
và $b
và 'thực hiện kiểm tra' cho từng thành phần.
Vì vậy, theo mặc định:
$a cmp $b
để so sánh theo chuỗi, hoặc sort { $a <=> $b }
cho số.
Nhưng kết quả là, bạn có thể áp dụng các tiêu chí sắp xếp tùy chỉnh phức tạp tùy ý:
#!/usr/bin/perl
use strict;
use warnings;
sub sort_by_sc {
my ( $a_sc ) = $a =~ m/SC(\d+)/;
my ( $b_sc ) = $b =~ m/SC(\d+)/;
return $a_sc <=> $b_sc;
}
my @file_list = qw (
ABC38388.SC01.StatueGrade_MKP
ABC38388.SC02.Statue_GKP
DEF38389.SC03.Statue_HKP
XYZ38390.SC00.Statue_WKP
);
print sort sort_by_sc @file_list;
Hoặc được giảm xuống thành một lớp lót, đọc STDIN
hoặc một tệp (được phân tách bằng dòng, thường là đủ tốt):
perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} <>'
Thay vào đó, bạn có thể cung cấp cho nó kết quả của glob
mẫu thư mục thay thế:
perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} glob ( "*SC*")'