web-dev-qa-db-ja.com

bashスクリプトを使用して文字列+数値と組み合わせた文字列を並べ替える方法は?

これは、ソートしたいデータです。しかし、sortは数値を文字列に処理し、データは期待どおりにソートされませんでした。

/ home/files/profile1
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/profile8
/home/files/profile9

これを分類したい

/ home/files/profile1
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/profile8
/home/files/profile9
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16

Bashスクリプトによる良い方法はありますか? Rubyまたはpythonここにあるスクリプトは使用できません。

27
user760548

一時的なセンチネル文字を使用して、番号を区切ることができます。

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

ここでは、センチネル文字は「;」です。 -並べ替えるファイル名の一部であってはなりません-ただし、「;」を交換できますあなたが好きなキャラクターで。それに応じて、sedsorttrの部分を変更する必要があります。

パイプは次のように機能します。sedコマンドは、数値の前に番兵を挿入します。sortコマンドは、番兵をフィールド区切り文字として解釈し、2番目のフィールドを数値ソートキーとして並べ替え、trコマンドは、歩哨を再び削除します。

そしてlogは入力ファイルを示します-入力をsedにパイプすることもできます。

21
maxschlepzig

これは この質問 とよく似ています。問題は、並べ替える英数字フィールドがあり、-nはそれを賢く扱いませんが、バージョンのソート(-V)します。したがって、使用:

sort -V

この機能は現在、GNU、FreeBSD、OpenBSDのソート実装でサポートされています。

45
Thor

すべてのファイル名の最後の数値部分の前に同じプレフィックスが付いている場合は、並べ替えるときにそれを無視します。

sort -k 1.20n

(20は最初の桁の位置です。1と/home/files/profileの長さの合計です。)

数値以外の部分がいくつかある場合は、 センチネルを挿入 を使用します。