この出力をソートする方法 1,10,11..2

この出力をソートする方法 1,10,11..2

場合によっては、データベースに追加のディスクを追加する必要があります。これを行うには、すでに存在するディスクを確認するためにディスクを一覧表示する必要があります。

問題は、出力が常に1,10,11,12...2,20,21...3などにソートされることです。

必要な方法で出力をソートするにはどうすればよいですか? Simpleはsort機能しませんsort -t.. -k.. -n

ソートする必要がある項目の例:

[root@server1 ~]# oracleasm listdisks
DATA1
DATA10
DATA11
DATA12
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
FRA1
FRA10
FRA11
FRA2
FRA3
..
OCR1
OCR2
OCR3
....

出力を表示する方法は次のとおりです。

DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
..
..
FRA10
FRA11
..
OCR1
OCR2
OCR3
....

答え1

最善の方法は、GNUにパイプしsortsortGNU--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

答え2

利用できない場合は、sort --version-sort2つのフィールドに分割します。フィールド 1 = 数値ではなく先行、フィールド 2 = 整数、フィールド間に Tab キーを使用してフィールドを印刷します。次に、タブで区切られた2つのフィールドを使用してsortタブを削除します。 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シングルライナーは、次のコマンドラインフラグを使用します。 ::
-ePerlにファイルではなくインラインコードを見つけるように指示します。
-n:一度に1行ずつ入力を繰り返し、デフォルト$_で割り当てられます。 :コードインラインを実行する前に、入力行区切り文字(* NIXのデフォルト)を削除して
-l印刷するときに追加します。 :と同じですが、各ループの最後にある行もあります(明示的な項目を削除)。"\n"
-p-nprintprint

最初の行では、ランダムな数字(0-9)、数字ではなくランダムな数字\dです。\Dこれらのパターンはそれぞれ0回以上繰り返されます(使用済み*)。 2 つのパターンは、括弧を使用してキャプチャされ、LISTTAB に接続して印刷される 2 つのフィールドのいずれかに返されます。

2番目のPerlシングルライナーは、単に最初のTABルックアップ(空の文字列)を削除し、その行を印刷します。

2つのフィールドの場合は、sort次のオプションを使用します。 -k1,1:ASCIIモードでフィールド1をソートします。次に::
-k2,2nフィールド1が同じ場合は、フィールド2を基準に数字でソートします(-nオプション)。行の残りの部分がソートされないようにし、この列番号にのみソートを制限するために、フィールド
番号が2回繰り返されます。1,1

関連情報