Nejlepším řešením je přejít na GNU sort
, s GNU sort
's --version-sort
možnost povolena
takže by to bylo oracleasm listdisks | sort --version-sort
Z informační stránky
--version-sort’
Sort by version name and number. It behaves like a standard sort,
except that each sequence of decimal digits is treated numerically
as an index/version number. (*Note Details about version sort::.)
Na vašem vstupu mi to dává
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Pokud sort --version-sort
není k dispozici, rozdělte do 2 polí:pole 1 =úvodní nečíslice a pole 2 =celé číslo a vytiskněte pole s TAB mezi nimi. Poté použijte sort
na 2 polích oddělených TAB a poté TAB odeberte. Připojte pomocí potrubí, abyste se vyhnuli režii I/O. Zde je příklad s minimální částí dat z OP plus několik dalších záznamů:
echo 1 10 2 11 DATA DATA1 DATA10 DATA11 DATA2 FRA FRA1 FRA10 FRA11 FRA2 | \
xargs -n1 | \
perl -lne 'print join "\t", /(\D*)(\d*)/' | \
sort -k1,1 -k2,2n | \
perl -pe 's/\t//'
Tiskne:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
PODROBNOSTI:
Jednořádkové perlské řádky používají tyto příznaky příkazového řádku:
-e
:říká Perlu, aby hledal kód in-line, nikoli v souboru.
-n
:smyčka přes vstup jeden řádek po druhém, přiřazení k $_
ve výchozím stavu.
-l
:odstraňte oddělovač vstupních řádků ("\n"
na *NIX ve výchozím nastavení) před spuštěním kódu v řádku a připojte jej při tisku.
-p
:stejné jako -n
, ale také print
řádek na konci každé smyčky (eliminuje explicitní print
).
V rámci prvního jednoho řádku \d
je libovolná číslice (0-9) a \D
je jakákoli nečíslice. Každý z těchto vzorů se opakuje 0 nebo vícekrát (pomocí *
). Tyto dva vzory jsou zachyceny pomocí závorek a vráceny jako LIST
dvou polí, která jsou spojena na TAB a vytištěna.
Druhý jednořádkový Perl jednoduše odstraní první TAB, nenajde nic (prázdný řetězec) a vytiskne řádek.
Na sort
na 2 polích jsou použity tyto možnosti:-k1,1
:řazení na poli 1 ASCIIbeticky. Pak:
-k2,2n
:pokud je pole 1 stejné, seřaďte podle pole 2 číselně (-n
volba).
Všimněte si, že číslo pole se opakuje dvakrát (např. 1,1
), abyste zabránili řazení na zbytku řádku a omezili řazení pouze na toto číslo sloupce.