根据第一个数值排序文件列表

时间:2013-02-07 14:08:42

标签: shell unix sorting sed awk

我是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 

我想在数字上对它进行排序,直到遇到第一个下划线(数字可以在任何位置,而不是在第5个位置的eaxct)。如下所示:

File1_11_9_1 
File2_11_9_1 
. 
. 
. 
File8_Pkg 
File10_11_9_1 

我正在尝试ls -1|sort -t"_" -k1,4n 但这似乎不起作用。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

好吧,我有点懒,难以记住那种奇特的选择。

只需组合linux power文本处理程序即可实现它。必须有更优雅的方式来做到这一点。但这没有太多的思考工作

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 :(得分:0)

在第5个角色前进尝试ls -1 | sort -t _ -k1.5,1n

答案 3 :(得分:0)

假设您的文件名不以数字开头,这是使用GNU awk的一种方式。它将按下划线之前的第一个数字排序,然后按出现顺序排序。另外一般来说,解析lsa bad idea,虽然它可以与您的文件名一起使用。我更喜欢使用GNU find。像:

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

script.awk的内容:

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")