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

ファイル名が数字で始まらないと仮定すると、これが。を使用する1つの方法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 に答える
0

Try ls -1 | sort -t _ -k1.5,1n this sort on the 5th character forward.

于 2013-02-07T14:32:48.170 に答える