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 /file/profile3
/main/file/profile4
/master/file/profile5 /master /file/profile6
/ master/file/profile7 /master/file/profile8 /master/file /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 /file/profile9
/home/file/profile10 /home/ file/profile11 /
home /file/profile12 /home/file/profile14 /home/file/profile15 /home/file /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 ';'

ここで監視文字は「;」です。これは、ソートしたいファイル名の一部にすることはできません。ただし、「;」を任意の文字に置き換えることができます。したがってsedsortセクションを変更する必要がありますtr

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

と入力ファイルを表します。log入力を 。sed

答え3

すべてのファイル名の最後の数字部分の前に同じプレフィックスがある場合、ソートは無視されます。

sort -k 1.20n

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

数字以外の部品が複数ある場合センチネル挿入

関連情報