これは、ソートしたいデータです。しかし、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ここにあるスクリプトは使用できません。
一時的なセンチネル文字を使用して、番号を区切ることができます。
$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'
ここでは、センチネル文字は「;」です。 -並べ替えるファイル名の一部であってはなりません-ただし、「;」を交換できますあなたが好きなキャラクターで。それに応じて、sed
、sort
、tr
の部分を変更する必要があります。
パイプは次のように機能します。sed
コマンドは、数値の前に番兵を挿入します。sort
コマンドは、番兵をフィールド区切り文字として解釈し、2番目のフィールドを数値ソートキーとして並べ替え、tr
コマンドは、歩哨を再び削除します。
そしてlog
は入力ファイルを示します-入力をsed
にパイプすることもできます。
これは この質問 とよく似ています。問題は、並べ替える英数字フィールドがあり、-n
はそれを賢く扱いませんが、バージョンのソート(-V
)します。したがって、使用:
sort -V
この機能は現在、GNU、FreeBSD、OpenBSDのソート実装でサポートされています。
すべてのファイル名の最後の数値部分の前に同じプレフィックスが付いている場合は、並べ替えるときにそれを無視します。
sort -k 1.20n
(20は最初の桁の位置です。1と/home/files/profile
の長さの合計です。)
数値以外の部分がいくつかある場合は、 センチネルを挿入 を使用します。