我有一个文件,它看起来像这样:
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中使用'sort'命令时,它不会这样做,因为它说它不是数字。在Perl中有没有一种方法可以按字母数字排序?
4条答案
按热度按时间3bygqnnd1#
如果你读了the documentation for sort,你会发现你不需要在Perl中进行数字排序,你也可以进行字符串比较。
但是这仍然会给你留下一个问题,比如19q会排在6p之前,所以你可以写你自己的排序函数,在做比较之前做你想要的任何转换。
23c0lvtd2#
tvmytwxo3#
实际上我找到了这个问题的答案。虽然代码看起来有点复杂。
lmvvr0a84#
在非常普遍的情况下,如何处理相等但写法不同的整数是一个模棱两可的问题,因为可能会有前导零。下面的比较函数(对于
sort
)允许我们在没有不同整数的情况下考虑字典顺序。这与zsh的数字排序相同。例如,可以得到以下排序的元素:
注1:使用
<=>
时,假设数字不是太大。注2:在这个问题中,用户希望对第二列(而不是整个字符串)进行字母数字排序。因此,在这个特定的情况下,比较函数可以只忽略第一列,或者可以使用Schwartzian transform。