2

bash シェルでソートする必要があるファイルのリストをフルパスで持っています。

リストは次のようになります

/total/path/software/version1.2.3.4/filename.10.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.1.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.2.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.12.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.1.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.3.cfg -- infomation grepped
/long/path/software/version1.2.3.4/filename.18.cfg -- infomation grepped
/full/path/software/version1.2.3.4/filename.20.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

リストを最初にパスでソートし、次にファイル名番号でソートする必要があります。

私はもう試した:

 sort -t'.' -k 1,1 -k 2,5n fileame.txt

ただし、パスでのみソートされます。私が行った場合:

sort -t'.' -k5n filename.txt

それは正常に動作します。パスでソートした後、ファイル名を数値順に取得するにはどうすればよいですか?

ありがとう

4

3 に答える 3

1

これはあなたが探しているものですか?

 Kaizen ~
 $ for ch in `sort testfile.txt | cut -c2-3 | uniq `
 > do
 > sed -n "/^\/$ch/p" testfile.txt | sort -t'.' -k5n ;
 > done ;

結果 :

/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

アプローチはあなたと同じです、私はsedを追加しました!!

于 2013-05-23T23:35:29.813 に答える
1

ソート キーを作成し、そのソート キーでソートしてから、ソート キーを削除します

どれどれ...

$ 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 桁がありません。ピリオドでフィールドを分割してソートしようとしているものはすべて失敗します。上記は引き続き機能します。

于 2013-05-24T03:27:49.603 に答える