我有一个如下所示的文件:
80,1p21
81,19q13
82,6p12.3
83,Xp11.22
84,3pter-q21
86,3q26.33
87,14q24.1-q24.2|14q24|14q22-q24
88,1q42-q43
89,11q13.1
90,2q23-q24
91,12q13
92,2q22.3
93,3p22
94,12q11-q14
95,3p21.1
97,14q24.3
98,2p16.2
我想根据第二列对它们进行排序。第一列也应该相应改变。当您在 Perl 中使用“排序”命令时,它不会执行此操作,因为它说它不是数字。有没有办法在 Perl 中按 alpha 数字对事物进行排序?
如果你读过排序的文档 http://perldoc.perl.org/functions/sort.html,您会发现不需要在 Perl 中进行数字排序。您也可以进行字符串比较。
@sorted = sort { $a cmp $b } @unsorted;
但这仍然给你带来了一个问题,例如,19q 会排在 6p 之前。因此,您可以编写自己的排序函数,该函数可以在进行比较之前进行您想要的任何转换。
@sorted = sort my_complex_sort @unsorted;
sub my_complex_sort {
# code that compares $a and $b and returns -1, 0 or 1 as appropriate
# It's probably best in most cases to do the actual comparison using cmp or <=>
# Extract the digits following the first comma
my ($number_a) = $a =~ /,(\d+)/;
my ($number_b) = $b =~ /,(\d+)/;
# Extract the letter following those digits
my ($letter_a) = $a =~ /,\d+(a-z)/;
my ($letter_b) = $b =~ /,\d+(a-z)/;
# Compare and return
return $number_a <=> $number_b or $letter_a cmp $letter_b;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)