如何使用Perl对国会图书馆(LCC)编号进行排序?

时间:2016-04-15 04:17:02

标签: linux perl sorting unix

假设我有这些国会图书馆(LCC)编号:

BX2230.3
BX2237
BX2380 .R67 2002 
BX932 .C53 1993

使用sortsort -b忽略Linux上的空格命令就像这样:

BX2230.3
BX2237
BX2380 .R67 2002 
BX932 .C53 1993

但是,他们应该这样订购:

BX932 .C53 1993
BX2230.3
BX2237
BX2380 .R67 2002 

有没有办法通过sortperl执行此操作?在单词中:按字母顺序对每行的前两个字符进行排序,数字后面的前两个字符后面的数字,“。”后面的字母。 (如果它存在)按字母顺序排列,数字跟随数字?

2 个答案:

答案 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;