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 

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

File1_11_9_1 
File2_11_9_1 
. 
. 
. 
File8_Pkg 
File10_11_9_1 

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

4

4 回答 4

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
于 2013-02-07T14:28:17.050 回答
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 
于 2013-02-07T14:27:10.750 回答
0

在第 5 个字符上尝试ls -1 | sort -t _ -k1.5,1n这种排序。

于 2013-02-07T14:32:48.170 回答
0

假设您的文件名不以数字开头,这是使用GNU awk. 它将按下划线前的第一个数字排序,然后按出现顺序排序。同样一般来说,解析ls一个坏主意,尽管它会与您的文件名一起“工作”。我更喜欢使用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")
于 2013-02-11T06:46:03.070 回答