我是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
但这似乎不起作用。
答案 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
的一种方式。它将按下划线之前的第一个数字排序,然后按出现顺序排序。另外一般来说,解析ls
是a 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")