GNU/Linux >> Linux の 問題 >  >> Linux

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

あなたの最善の策は、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 )、行の残りの部分での並べ替えを防ぎ、並べ替えをこの列番号だけに制限します。


Linux
  1. フィールドの数値に基づいてファイルをソートする方法は?

  2. ps出力をプロセス開始時間でソートする方法は?

  3. du -h 出力をサイズでソートするにはどうすればよいですか

  1. Linuxコマンドの出力を変数に割り当てる方法

  2. Du出力をサイズで並べ替える方法は?

  3. プログラムの出力をZipファイルにリダイレクトする方法は??

  1. リダイレクションの使い方を覚える方法は?

  2. Pulseaudioで仮想出力を作成する方法は?

  3. 出力を列で並べ替えますか?