私がソートしたいデータです。ただし、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 ';'
ここで監視文字は「;」です。これは、ソートしたいファイル名の一部にすることはできません。ただし、「;」を任意の文字に置き換えることができます。したがってsed
、sort
セクションを変更する必要がありますtr
。
パイプラインは次のように動作します。sed
コマンドは数字の前にマーカーを挿入し、コマンドはマーカーをフィールド区切りsort
文字として解釈し、2番目のフィールドを数値ソートキーとしてソートし、コマンドがマーカーを再びtr
削除します。
と入力ファイルを表します。log
入力を 。sed
答え3
すべてのファイル名の最後の数字部分の前に同じプレフィックスがある場合、ソートは無視されます。
sort -k 1.20n
(20は最初の数字の位置です。1に加えた長さです/home/files/profile
。)
数字以外の部品が複数ある場合センチネル挿入。