【问题标题】:Grouping files based on info gathered from parsing through file name根据通过文件名解析收集的信息对文件进行分组
【发布时间】:2012-07-07 04:07:27
【问题描述】:

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

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

0997 是商店编号。文件首先需要按商店分组。我可以处理那部分。商店编号后面的文本是文件“类型”。我想我可以通过并解析出文件类型。接下来的 6 个字符确实是我需要解析的。我应该能够根据这 6 个字符将文件“分组”在一起。

那么,最好的方法是什么?一个警告:一旦我将这些文件组合在一起,我需要让它们首先处理每个商店最旧的文件。

【问题讨论】:

  • 基本上,因为文件名的前导字符没有分隔符或设置字符数,我想如果可能的话,我需要通过文件名向后“awk”。
  • 部门是“4f”(在点前留下 6 个字符)吗?名称有什么模式还是固定宽度的“字段”?显示更多代表变异范围的样本名称。这是在 Linux 还是 Unix(哪个 Unix)上?

标签: parsing awk ksh


【解决方案1】:

好像你可以用 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

用上面的方法分离后,您可能可以将其通过管道传输到另一个脚本或命令并进行排序。

【讨论】:

    【解决方案2】:

    我可能不会在这里添加任何东西,但我倾向于发现命令行 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 line perl 的指南:http://wwwx.cs.unc.edu/~jsterrel/articles/perl-cli.php

    但我想这取决于你对 awk 或 perl 的理解程度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多