【问题标题】:Splitting a concatenated file based on header text根据标题文本拆分连接的文件
【发布时间】:2010-12-09 17:21:39
【问题描述】:

我有一些非常大的文件,它们基本上是几个小文件的串联,我需要将它们拆分为它们的组成文件。我还需要将文件命名为与原始文件相同。

例如文件QMAX123QMAX124 已连接到:

;QMAX123 - Student

... file content ...

;QMAX124 - Course

... file content ...

我需要将文件QMAX123重新创建为

;QMAX123 - Student

... file content ...

QMAX124一样

;QMAX124 - Course

... file content ...

原始文件的标头;QMAX<some number> 是唯一的,仅作为标头出现在文件中。

我使用下面的脚本来拆分文件的内容,但我无法调整它以获取正确的文件名。

awk '/^;QMAX/{close("file"f);f++}{print $0 > "file"f}' <filename>

所以我可以调整该脚本以正确命名文件,或者我可以根据文件的内容重命名使用上述脚本创建的拆分文件,以更容易者为准。

如果这对您的回答有任何影响,我目前正在使用 cygwin bash(它具有 perl 和 awk)。

【问题讨论】:

    标签: perl unix awk


    【解决方案1】:

    下面的 Perl 应该可以解决问题

        use warnings ;
        use strict ;
    
        my $F   ; #will hold a filehandle
        while (<>) {
          if ( / ^ ; (\S+) /x) {
            my $filename = $1 ;
            open $F, '>' ,  $filename  or die "can't open $filename " ;
          } else {
            next unless defined $F ;
            print $F $_ or warn "can't write"  ;
          }
        }
    

    请注意,它会丢弃文件名 next unless defined $F ; 的行之前的任何输入。您可能需要生成错误或添加默认文件。告诉我,我可以改变它

    【讨论】:

    • 看起来很接近,但它正在剥离文件头。您可以进行更改以保留它们吗?
    • 啊,没关系,我发现它在 open 下添加了一个 print $F $1。感谢您的帮助
    • 好的 - 我不清楚这是文件的一部分,还是有点“胶水”。很高兴你想出来了。其他方法是摆脱 else 并在每次迭代时打印。
    • 道歉 - 很清楚,但我没有阅读问题。还好不是考试 :-)
    【解决方案2】:

    有了 awk,就这么简单

    awk '/^;QMAX/ {filename = substr($1,2)} {print >> filename}' input_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多