Você pode usar a Schwartzian
transform em Perl
para fazer isso:
perl -ne '
push @A, $_.=<>}{
print for
# Schwartzian transform
map { $_->[0] } # recover the line
sort { $a->[1] <=> $b->[1] } # do the sorting using the key
map { [$_,/_(\d+)M$/m] } # setup: line(zeroth-indexed) + sorting key(first index)
@A; # operate on elements of array @A
' yourfile
Resultados
>nexus0013_Pseudomonas_53M
.....................................
>nexus0013_Pseudomonas_54M
.....................................
>nexus0013_Pseudomonas_55M
.....................................
>nexus0013_Pseudomonas_57M
.....................................
>nexus0013_Pseudomonas_58M
.....................................
>nexus0013_Pseudomonas_59M
.....................................
>nexus0013_Pseudomonas_60M
.....................................
>nexus0013_Pseudomonas_61M
.....................................
>nexus0013_Pseudomonas_62M
.....................................
coloque o arquivo em pares de linhas na matriz @A
. Então, no eof, realizamos a manobra Schwartzian
, "map- > sort- > map". Neste nós carregamos toda a linha + os dados de ordenação ao longo e no último passo da manobra, recuperamos a linha depois de ter sido ordenada. Portanto, para este caso, a chave de classificação é o número antes do M que fica no limite da linha. (Lembre-se que acrescentamos a próxima linha)