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

Aug 24 2020

データベースにディスクを追加する必要がある場合があります。そのためには、ディスクをリストして、どのディスクがすでに存在するかを確認する必要があります。

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

この出力を希望どおりに並べ替えるにはどうすればよいですか?単純なもの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
....

回答

31 iruvar Aug 24 2020 at 06:03

あなたの最善の策はsort、GNUsort--version-sortオプションを有効にしてGNUにパイプすることです

だからそれは 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
10 TimurShtatland Aug 25 2020 at 01:54

sort --version-sort使用できない場合は、フィールド1 =先頭の非数字、およびフィールド2 =整数の2つのフィールドに分割し、フィールドをTABで挟んで印刷します。次にsort、2つのTAB区切りフィールドで使用してから、TABを削除します。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:と同じですが-nprint各ループの最後の行もあります(明示的なを削除しますprint)。

最初のワンライナー内に\dは、任意の数字(0〜9)があり、\D任意の非数字です。これらの各パターンは、0回以上繰り返されます(を使用*)。2つのパターンは括弧を使用してキャプチャされ、LIST2つのフィールドとして返され、TABで結合されて印刷されます。

2番目のPerlワンライナーは、最初のTABを削除し、何も表示せず(空の文字列)、その行を出力します。

sort2つのフィールドに、これらのオプションが使用されています-k1,1:ソートフィールド1 ASCIIbeticallyに。次に::
-k2,2nフィールド1が同じ場合は、フィールド2で数値的に並べ替え-nます(オプション)。行の残りの部分での並べ替えを防ぎ、並べ替えをこの列番号のみに制限するために
、フィールド番号が2回繰り返されることに注意してください(例1,1:)。