【问题标题】:Split a file in several output在多个输出中拆分文件
【发布时间】:2013-04-19 11:13:37
【问题描述】:

我正在尝试将一个大文件分成不同的文件,其中包含文件中每个变量的单个信息。

我的输入文件如下所示:

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM

...info here 1.....

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 2....

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 3....        

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM

....info here 4....

在这种情况下,我想创建两个输出文件(一个用于 PID008SM 和 CL001-SC) 以及与他们每个人相关的信息。

CL001-SC 的输出:

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  CL001-SC

....info here 2...

....info here 3...

PID008SM 的输出

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  PID008SM
....info here 1....

....info here 4....

我使用的脚本是在 Perl 中,但任何建议都非常受欢迎。 提前谢谢你。

代码:

#!/usr/bin/perl;
use strict;
use warnings;

my $file1 = $ARGV[0] ;
my $file2 = $ARGV[1];

open (F1, $file1); #Opens first .vcf file for comparison
open (F2, $file2); #2nd for comparison

my %file;

## Create the hash key with each line of the file2
while (<F2> ) {
        #chomp;
        $file{$_}='';
}

## Print the line , if key   exist in the hash ;       

foreach my $string (<F1>) {

        if ( exists $file{$_}) and ($string =~ /(#)(.+?)(#)/s) {
                print $string;
        }
}

【问题讨论】:

  • 所以你有相同的标题一遍又一遍,然后段落之间?指定更准确,以便我们给出更准确的答案。
  • 您的代码似乎与您的问题无关。您的问题是关于将文件一分为二,而代码比较两个不同文件的匹配行。请澄清。
  • @fedorqui 正确,我一遍又一遍地使用相同的标题以及介于两者之间的段落。我想提取每个样本之间的信息,并(如果可能)保留一个石南花。抱歉,上述描述没有更详尽。
  • @dan1111 我正在尝试使用该示例 perl 脚本,只是为了查看是否能够在两个文件之间找到匹配项,然后将输出打印到不同的文件中。很抱歉没有说清楚。

标签: perl unix split truncate


【解决方案1】:

大概是这样的吧?

use strict;
use warnings;

open my $fh, '<', 'chrom.txt' or die $!;

my %fh;

while (<$fh>) {

  if ( /^#CHROM/ ) {

    my $name =  (split)[-1];

    if ($fh{$name}) {
      select $fh{$name};
      next;
    }

    my $file = "$name.txt";
    open $fh{$name}, '>', $file or die qq{Unable to open "$file" for output: $!};
    print STDOUT qq{Created file "$file"\n};
    select $fh{$name};
  }

  print;
}

【讨论】:

  • 非常感谢!所以基本上你为每个标题创建一个哈希,你为每个键创建和输出文件。然后它如何将石南花之间的信息放入每个输出文件中?感谢您的帮助!
  • select 函数切换默认输出文件句柄,以便print 没有文件句柄参数输出到最后选择的句柄。 STDOUT 是任何程序启动时选择的句柄。请接受您认为最能回答您的问题的答案。
【解决方案2】:
awk '/^#CHROM/{typ=$10;a[$0]++} a[$0]<2{print >> typ}' inputFile

这个 awk 脚本似乎可以工作 +

【讨论】:

  • 感谢您的回复。您能否向我解释一下 {print >> typ}' 的作用?谢谢!
  • typ 是一个包含最新类型的变量,即。 CL001-SC 或 PID008SM。所以 {print >> typ} 将当前行追加到相应的文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2020-12-07
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多