假设我有这些国会图书馆(LCC)编号:
BX2230.3
BX2237
BX2380 .R67 2002
BX932 .C53 1993
使用sort
或sort -b
忽略Linux上的空格命令就像这样:
BX2230.3
BX2237
BX2380 .R67 2002
BX932 .C53 1993
但是,他们应该这样订购:
BX932 .C53 1993
BX2230.3
BX2237
BX2380 .R67 2002
有没有办法通过sort
或perl
执行此操作?在单词中:按字母顺序对每行的前两个字符进行排序,数字后面的前两个字符后面的数字,“。”后面的字母。 (如果它存在)按字母顺序排列,数字跟随数字?
答案 0 :(得分:4)
有一个模块Library::CallNumber::LC
,特别是为了这个目的。它有一个normalize
方法,可以将LCN转换为可直接排序的方法。它会将您的数字列表更改为此
BX22303
BX2237
BX2380 R67 02002
BX0932 C53 01993
所以你可以像这样对你的数字进行排序
use strict;
use warnings 'all';
use Library::CallNumber::LC;
my @numbers = (
'BX2230.3',
'BX2237',
'BX2380 .R67 2002',
'BX932 .C53 1993',
);
print "$_\n" for sort {
my ($aa, $bb) = map { Library::CallNumber::LC->normalize($_) } ($a, $b);
$aa cmp $bb;
} @numbers;
BX932 .C53 1993
BX2230.3
BX2237
BX2380 .R67 2002
答案 1 :(得分:3)
只需尝试这个
$a
和$b
反转关键字进行排序。你想选择特定的单词并用这些单词排序。因此,请使用地图并将该字词存储在$adup
和$bdup
中,然后按$adup
和$bdup
变量进行排序。
open my $fh ,"<", "file.txt" or die"$! error opening";
my @ar = <$fh>;
my @sort = sort{ my ($adup, $bdup) = map /^\D+(\d+)/, $a, $b; $adup <=> $bdup } @ar;
print @sort;