あなたの最善の策は、GNU sort
にパイプすることです 、GNU sort
を使用 の --version-sort
オプション有効
oracleasm listdisks | sort --version-sort
となります
情報ページから
--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::.)
あなたの入力で、それは私に与えます
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
sort --version-sort
の場合 フィールド 1 =先頭の非数字、フィールド 2 =整数の 2 つのフィールドに分割し、それらの間に TAB を付けてフィールドを出力します。次に sort
を使用します 2 つのタブ区切りフィールドで、タブを削除します。 I/O オーバーヘッドを避けるために、パイプで接続します。以下は、OP からのデータの最小限のスライスと、いくつかの追加レコードを含む例です:
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//'
版画:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
詳細:
perl ワンライナーでは、次のコマンド ライン フラグを使用します。
-e
:ファイルではなくインラインでコードを探すように Perl に指示します。
-n
:入力を 1 行ずつループし、$_
に割り当てます。 デフォルトで。
-l
:入力行セパレーターを取り除きます ("\n"
*NIX ではデフォルトで) コードをインラインで実行する前に、印刷時に追加します。
-p
:-n
と同じ 、 print
も 各ループの最後の行 (明示的な print
を削除します) ).
最初のワンライナー \d
内 任意の数字 (0 ~ 9) で、\D
は任意の非数字です。これらの各パターンは 0 回以上繰り返されます (*
を使用) )。 2 つのパターンは括弧を使用してキャプチャされ、LIST
として返されます。 TAB で結合され、印刷される 2 つのフィールドの。
2 番目の Perl ワンライナーは、最初の TAB を単純に削除し、何も検索せず (空の文字列)、その行を出力します。
sort
へ 2 つのフィールドで、次のオプションが使用されます:-k1,1
:フィールド 1 で ASCII 的にソートします。それで:
-k2,2n
:フィールド 1 が同じ場合、フィールド 2 で数値的に並べ替えます (-n
オプション)。
フィールド番号が 2 回繰り返されることに注意してください (例:1,1
)、行の残りの部分での並べ替えを防ぎ、並べ替えをこの列番号だけに制限します。