最後

2013-06-05 9 views
5

で番号で文字列のbashのソートリストにそれはそうのように並べ替えるときはgrepによるIパイプそれを私は最後

/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

をソートする必要がある最後のバージョン番号を持つファイルのリストを持っている:

echo $files | sort -n 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

-nがファイル名の最初の数字で混乱していると思います。

私は、最後の番号順に並べ替えることができますどのように

+0

パスの同じ深さを? – Kevin

+0

はい、私はあなたが勝つ –

答えて

11
Kaizen ~/so_test $ cat ztestfile1 | sort -t'/' -n -k10 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

使用例は、このヘルプのでしょうか?すなわち

Kaizen ~/so_test $ cat ztestfile1 | sort -V 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

そのにソートするために、文字列内の数値の違いに見える一種で-V(資本)オプションを注意してください.....位置から独立しているように

別の方法... ..バージョン番号のように。

manページのテキスト::

-V, --version-sort 
      natural sort of (version) numbers within text 
+0

これは私がマニュアルページにあり、 'sort -n -t '/' -k 10'という余分なスペースを持っていて、明らかにソートしていないと、 –

+0

オハイオ州オハイオ州、問題は今ソートされているようだ... :) – nsd

+0

この種の解決策を知り、ファイルの深さを指定する必要があります。 – michas

3

あなたは、列区切りとして/を使用することができます。第一フィールドで、フロントにsortを最後のフィールドを持って

sort -n -t/ -k 10 
+0

をソートしようとするまで深さを知らない...あなたの答えは私たちの前に1分だった:+1 – nsd

1

使用awk最初のフィールドを取り除くためにcutを適用してください。 here document

以下
awk -F'/' '{print($NF"/"$0)}' <<! | sort -k1n,1n -t'/' | cut -f2- -d'/' 
> /this/is/a/file/path/product-2.0/file/name/7 
> /this/is/a/file/path/product-2.0/file/name/10 
> /this/is/a/file/path/product-2.0/file/name/12 
> /this/is/a/file/path/product-2.0/file/name/13 
> /this/is/a/file/path/product-2.0/file/name/6 
> /this/is/a/file/path/product-2.0/file/name/8 
> /this/is/a/file/path/product-2.0/file/name/9 
> ! 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
0

これは、あなたが並べ替え、最後の値を取り、ラインの開始時にそれを置く、フィールドセパレータとして/を使用してパスの最後の項目でソートしますその行の先頭から値を削除します。

cat data | awk 'BEGIN { FS="/"} { print $(NF) " " $0 }' | sort -n | sed 's/^.*\s//g' 
0

やPerlやRubyのようなワンライナー何か使用:常に

ruby -we 'print *readlines.sort_by{|x| File.basename(x).to_i}'