假设我有这些国会图书馆(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来做到这一点?单词顺序:按字母顺序排列每一行的前两个字符,前两个字符后面的数字,“”之后的字母。(如果它存在的话)按字母顺序排列,数字后面的数字呢?
发布于 2016-04-15 04:59:26
有一个模块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发布于 2016-04-15 04:52:15
简单地试试这个
$a和$b为排序反向关键字。你想要选择特定的单词,并与这些词排序。因此,使用map并将单词存储在$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;https://stackoverflow.com/questions/36638173
复制相似问题