ソート キーを作成し、そのソート キーでソートしてから、ソート キーを削除します。
どれどれ...
$ while read line
do
dirname=${line%/*} #Directory names
number=$(echo "$line" | sed 's/.*\.\([0-9]*\)\.cfg.*/\1/') # File number
printf "%-60.60s %04d | %s\n" "$dirname" "$number" "$line"
done < filetext.txt | sort | sed "s/.* \| //"
これは、ループから各行を読み取りfiletext.txt
、ループにパイプしwhile read line
ます。
はBASHdirname
の機能を使用しています。${parameter%word}
これは の値を取り、${parameter}
pattern に一致する右側から最小量を削除しますword
。したがって、${line%/*}
は を取り$line
、最後のスラッシュとその後のすべての文字を削除しています。
number
少しトリッキーでした。.44.cfg
ファイル名の末尾に のようなものがあることに気付きました。つまり、その特定のパターンを見つけることができれば、ファイル番号を見つけることができました. 私のsed
コマンドは、ピリオド、0 個以上の数字、.cfg
. の順に検索し、数字をグループとしてマークします。次に、行全体を最初のグループ化で置き換えて、番号を指定します。
次に、 を使用してディレクトリと番号を出力しprintf
ます。ディレクトリ名を 60 文字 (必要に応じて増やすことができます) にスペースを埋め、次に 4 桁の数字を入力します。これにより、次のようなソート キーが作成されます。
/full/path/software/version1.2.3.4 0001
/full/path/software/version1.2.3.4 0003
/full/path/software/version1.2.3.4 0012
/full/path/software/version1.2.3.4 0020
/long/path/software/version1.2.3.4 0001
/long/path/software/version1.2.3.4 0002
/long/path/software/version1.2.3.4 0018
/real/path/software/version1.2.3.4 0004
/total/path/software/version1.2.3.4 0005
/total/path/software/version1.2.3.4 0010
このソート キーに行を追加してから、ソートを実行します。その後、並べ替えキーを行から削除します。結果:
/full/path/software/version1.2.3.4/filename.1.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.3.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.12.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.20.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.1.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.2.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.18.cfg -- infomation grepped
/real/path/software/version1.2.3.4/filename.4.cfg -- infomation grepped
/total/path/software/version1.2.3.4/filename.5.cfg -- infomation grepped
/total/path/software/version1.2.3.4/filename.10.cfg -- infomation grepped
他の人が回答したように、ファイル名の特定の形式に依存していないことに注意してください。こんなセリフがあったら?
/total/path/software/version1.2/filename.10.cfg -- infomation grepped
その行には小数点以下 5 桁がありません。ピリオドでフィールドを分割してソートしようとしているものはすべて失敗します。上記は引き続き機能します。