この出力をソートする方法1,10,11..2
データベースにディスクを追加する必要がある場合があります。そのためには、ディスクをリストして、どのディスクがすでに存在するかを確認する必要があります。
問題は、出力が常に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
....
回答
あなたの最善の策は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
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
:と同じですが-n
、print
各ループの最後の行もあります(明示的なを削除しますprint
)。
最初のワンライナー内に\d
は、任意の数字(0〜9)があり、\D
任意の非数字です。これらの各パターンは、0回以上繰り返されます(を使用*
)。2つのパターンは括弧を使用してキャプチャされ、LIST
2つのフィールドとして返され、TABで結合されて印刷されます。
2番目のPerlワンライナーは、最初のTABを削除し、何も表示せず(空の文字列)、その行を出力します。
sort
2つのフィールドに、これらのオプションが使用されています-k1,1
:ソートフィールド1 ASCIIbeticallyに。次に::
-k2,2n
フィールド1が同じ場合は、フィールド2で数値的に並べ替え-n
ます(オプション)。行の残りの部分での並べ替えを防ぎ、並べ替えをこの列番号のみに制限するために
、フィールド番号が2回繰り返されることに注意してください(例1,1
:)。