2013-02-07 32 views
2

我是Unix新手。我需要一些幫助排序文件名。我有一個文件列表如下:基於第一個數值排序文件列表

FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
LE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
E15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
Fi1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql 

我想,直到遇到第一個下劃線以數字排序呢(數量可在anyposition,並在第5位不eaxct)。對於如下EX-:

File1_11_9_1 
File2_11_9_1 
. 
. 
. 
File8_Pkg 
File10_11_9_1 

我與ls -1|sort -t"_" -k1,4n 嘗試,但這一點兒也不似乎工作。

+0

我認爲它的工作原理。無論如何,它將File10放在File1,File2 ... – fedorqui

+1

之前這正是你所需要的:http://theunixshell.blogspot.com/2013/02/sorting-files-based-upon-numeric-value.html – Vijay

回答

0

嗯,我有點懶,記得排序奇特的選擇。

只是結合linux電源文本處理程序來實現它。必須有更優雅的方式來做到這一點。但這是工作沒有太多思考

your ls...|awk -F'[Ee_]' '{print $2" "$0}'|sort -n|sed -r 's/[0-9]+ //' 

編輯

添加一個純awk的一行代碼:

ls...|awk -F'[Ee_]' '{a[NR]=$2;b[$2]=$0;}END{n=asort(a);for(i=1;i<=n;i++)print b[a[i]]}' 

的作品,如:

kent$ echo "FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
FILE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
FILE15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
File1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql"|awk -F'[Ee_]' '{print $2" "$0}'|sort -n|sed -r 's/[0-9]+ //' 
File1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
FILE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
FILE15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 
2
$ sort -k1.5n file 
File1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
FILE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
FILE15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 
+0

這個作品Ed? –

+0

它只是在第一個字段(-k1.5)的第五個字符處開始數字排序(n),因此它跳過單詞「file」,然後按數字排序。 –

+0

我在'info sort'中發現了這個特性(字符和字段)中的解釋沒有在'man sort'中描述。當然使得很多任務更容易!已經有了我的+1。 –

0

TR這種排在第5個字符前面的是ls -1 | sort -t _ -k1.5,1n

0

假設你的文件名不是以數字開頭的,這裏有一個使用GNU awk的方法。它將按照下劃線之前的第一個數字排序,然後按發生順序排序。另外一般來說,解析lsa bad idea,雖然它會與你的文件名一起工作。我更喜歡使用GNU find。運行,如:中script.awk

awk -f script.awk <(find ./* -maxdepth 1 -type f -name "*.sql" -printf "%f\n") 

內容:

BEGIN { 
    FS="[^0-9]+" 
} 

{ 
    a[$2] = (a[$2] ? a[$2] ORS : "") $0 
} 

END { 
    for (i in a) { 
     b[j++]=i+0 
    } 

    n = asort(b) 

    for (k=1;k<=n;k++) { 
     print a[b[k]] 
    } 
} 

結果:

Fi1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
LE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
E15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 

另外,這裏是一個班輪:

awk -F "[^0-9]+" '{ a[$2] = (a[$2] ? a[$2] ORS : "") $0 } END { for (i in a) b[j++]=i+0; n = asort(b); for (k=1;k<=n;k++) print a[b[k]] }' <(find ./* -maxdepth 1 -type f -name "*.sql" -printf "%f\n")