bash スクリプトを使用して文字列 + 数値を組み合わせた文字列をソートするにはどうすればよいですか?

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 スクリプトを使用できません。

答え1

これは、この質問問題は、ソートする英数字フィールドがあり、 では-nそれが適切に処理されないのに対し、 バージョン sort ( -V) では適切に処理されることです。 したがって、次を使用します。

sort -V

この機能は現在、GNU、FreeBSD、OpenBSD のソート実装でサポートされていることに注意してください。

答え2

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

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

ここで、センチネル文字は「;」です。これは、並べ替えるファイル名の一部であってはなりませんが、「;」を任意の文字と置き換えることができます。それに応じて、「,」および「.」のsed部分sorttr変更する必要があります。

パイプは次のように動作します:sedコマンドは任意の数字の前にセンチネルを挿入し、コマンドsortはセンチネルをフィールド区切り文字として解釈し、2 番目のフィールドを数値ソート キーとしてソートし、trコマンドはセンチネルを再度削除します。

および はlog入力ファイルを表します。入力を にパイプすることもできますsed

答え3

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

sort -k 1.20n

(20 は最初の数字の位置です。長さに 1 を加えたものです/home/files/profile。)

複数の異なる非数値部分がある場合、歩哨を挿入する

関連情報