根据从解析文件名收集的信息对文件进行分组

时间:2012-07-06 17:02:11

标签: parsing awk ksh

我正在使用KSH编写流程。我将不得不在单个目录中浏览大量文件,并根据通过文件名解析收集的信息将文件分组在一起。问题是文件名中没有“分隔符”(例如句点或下划线)。

以下是其中一个文件的示例:0997dept4fec81ae.dcn

0997是商店编号。首先需要按商店对文件进行分组。我能处理那个部分。商店编号后面的文本是文件“类型”。我想我可以狡猾地解析文件类型。接下来的6个字符就是我需要解析的内容。我应该能够根据这6个字符将文件“分组”在一起。

那么,最好的方法是什么?需要注意的是:一旦我将这些文件组合在一起,我就需要让它们先按照商店处理最旧的文件。

2 个答案:

答案 0 :(得分:0)

好像你可以用awk解决问题:

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");}'

这非常不优雅,并且假设您要分离的字段具有恒定的宽度(否则您没有提供信息)。您可以在此处查找其他字符串操作函数:

Awk String Manipulation

在用上面的内容分开之后,你可以将它传递给另一个脚本或命令并进行排序。

答案 1 :(得分: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内联位|同时读取组文件名 做

打印“$ Group,$ Filename”

其他事情

完成

这个bod的网页适合cmd行perl的指南:http://wwwx.cs.unc.edu/~jsterrel/articles/perl-cli.php

但我想这取决于你找到awk或perl有多清楚。