これは私が並べ替えたいデータです。しかし、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
部分sort
をtr
変更する必要があります。
パイプは次のように動作します:sed
コマンドは任意の数字の前にセンチネルを挿入し、コマンドsort
はセンチネルをフィールド区切り文字として解釈し、2 番目のフィールドを数値ソート キーとしてソートし、tr
コマンドはセンチネルを再度削除します。
および はlog
入力ファイルを表します。入力を にパイプすることもできますsed
。
答え3
すべてのファイル名の最後の数字部分の前に同じプレフィックスがある場合は、並べ替え時にそれを無視します。
sort -k 1.20n
(20 は最初の数字の位置です。長さに 1 を加えたものです/home/files/profile
。)
複数の異なる非数値部分がある場合、歩哨を挿入する。