0

KSHを使用してプロセスを書いています。1 つのディレクトリ内の多数のファイルを調べ、ファイル名の解析から収集した情報に基づいてファイルをグループ化する必要があります。問題は、ファイル名に「区切り文字」(ピリオドやアンダースコアなど) がないことです。

ファイルの 1 つのサンプルを次に示します: 0997dept4fec81ae.dcn

0997は店舗番号です。ファイルは最初にストアごとにグループ化する必要があります。私はその部分を扱うことができます。店舗番号の後のテキストは、ファイルの「タイプ」です。私は自分の道をイタチにして、ファイルの種類を解析できると思います。次の 6 文字は、実際に解析する必要があるものです。これらの 6 文字に基づいてファイルを「グループ化」できるはずです。

それで、これを行う最善の方法は何ですか?1 つの注意点: これらのファイルをグループ化したら、ストアごとに最も古いファイルを最初に処理する必要があります。

4

2 に答える 2

0

Seems like you can split things out with awk like:

ls *.dcn |awk 'BEGIN{FS=".";a[0]=0;a[1]=4;a[2]=9;a[3]=16}{for(i=0;i<3;i++){printf("%s\t",substr($1,a[i]+1,a[i+1]-a[i]));}printf("\n");}'

This is pretty inelegant, and assumes that the fields you want to separate have a constant width (you didn't give info otherwise). You can look for other string manipulation functions here:

Awk String Manipulation

After you separate with something like above you can probably pipe it to another script or command and sort.

于 2012-07-06T18:00:02.670 に答える
0

ここでは何も追加していないかもしれませんが、コマンド ライン perl がこのような場合に役立つことがよくあります。

print "0997dept4fec81ae.dcn 
0997dept4fec81ae.dcz
0997dept5fec81ae.dcn 
0997dept5fec81ae.dcz" | perl -ne '
chomp ;

if (/\d+\w{4}(.{6})/) {
    my $group = $1 ;

    push @{$h{$group}}, $_ ;
}

END { 
    for (sort keys %h) {
        print "Group: $_\n" ;

        print "\t$_\n" for sort @{$h{$_}} ;
    } 
} '

考え方を示しています。

最後の投稿のように-それを次のようなものにパイプできます

コマンドを見つける | perlインラインビット | while read Group Filename do

print "$グループ、$ファイル名"

他のもの

終わり

この bod の Web ページは、コマンドライン perl のガイドに適しています: http://wwwx.cs.unc.edu/~jsterrel/articles/perl-cli.php

しかし、それは awk や perl をどれだけ明確に見つけられるかにかかっていると思います。

于 2012-07-19T15:55:49.423 に答える