打印到文件

时间:2014-08-12 08:21:46

标签: bash perl

我试图找到两个文件之间的相交线。其中一个文件是'Sample_hg19_mapped.bed',另一个'intersect.RData'有一些与第一个相同的数据。

床文件:

chrM    16338   16363   HWI-ST575:220:C2MMMACXX:3:1112:17158:21371  255 -
chrM    16352   16377   HWI-ST575:220:C2MMMACXX:3:1102:7906:41988   255 -
chrM    16352   16377   HWI-ST575:220:C2MMMACXX:3:2113:18341:36393  255 -
chrM    16376   16401   HWI-ST575:220:C2MMMACXX:3:1310:14517:85268  255 -

RData文件:

HWI-ST575:220:C2MMMACXX:3:1310:14517:85268
HWI-ST575:220:C2MMMACXX:3:2113:18341:36393
HWI-ST575:220:C2MMMACXX:3:2113:45341:56393

作为输出,它需要给出在RData.file中具有相同值的BED文件行。例如,RData的第一个和第二个值存在于BED文件中,但不存在于第三个值中,因此在输出中它必须是:

chrM    16376   16401   HWI-ST575:220:C2MMMACXX:3:1310:14517:85268  255 -
chrM    16352   16377   HWI-ST575:220:C2MMMACXX:3:2113:18341:36393  255 -

我使用这些代码管理它:

perl -ane '$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;' Sample_hg19_mapped.bed  intersect.RData

但那些匹配的行在屏幕上,我希望它们保留在文件中,但我无法制作输出文件。我通过改变很多尝试了这个:

####!/bin/bash     
perl -ane '$f=$F[0].$F[1]';"Sample_hg19_mapped.bed intersect.RData"

if $k{$f};$k{$f}=$_ {
       print "$k{$f}$_";
} else {
       print "epic fail";
}
open($f, ">", "output.txt")
       or die "cannot open > output.txt: $!"; 
close $f;

print "done\n";

但我有很多错误,如:

/var/spool/slurmd/job2572366/slurm_script: line 3: Sample_hg19_mapped.bed intersect.RData: command not found
/var/spool/slurmd/job2572366/slurm_script: line 6: syntax error near unexpected token `}'
/var/spool/slurmd/job2572366/slurm_script: line 6: `} else {'

你能帮我解决这个问题吗? 非常感谢你

4 个答案:

答案 0 :(得分:0)

如果您的命令有效但输出到屏幕,只需将其重定向到文件:

command > output.txt

e.g。

perl -ane '$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;' Sample_hg19_mapped.bed  intersect.RData > output.txt

如果要删除所有空行,可以将next if /^\s*$/;添加到开头:

perl -ane 'next if /^\s*$/; $f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;' Sample_hg19_mapped.bed  intersect.RData > output.txt

这将跳过任何只有空格的输入行。

答案 1 :(得分:0)

您的代码有点乱,错误来自那里,但如果您想输出到文件,您可以这样做:

 open (MYFILE, '>>NameOfFile');
 print MYFILE $variable

答案 2 :(得分:0)

试试这个:

这会将您的数据值用作哈希键,然后在床文件中查找它们,将所有匹配项打印到' output.txt#39;。

use strict;
use warnings;
use autodie;

open my $bed, '<', 'in.txt';

open my $rdata, '<', 'Rdata.txt';

my (%bed, %rdata);

while(<$rdata>){
    chomp;
    $rdata{$_} = 2; # Each line is a key in the hash %rdata
}

open my $out_file, '>', 'output.txt';

while(<$bed>){
    chomp;
    next unless /chrM/;
    my @split = split/\t/;
    print $out_file "$_\n" if $rdata{$split[3]}; # will print to output.txt any line where the 4th column matches a key from %rdata 
}

答案 3 :(得分:0)

以下perl单行应该可以满足您的需求:

perl -lane'
    BEGIN { $x = pop; %h = map { chomp; $_ => 1 } <>; @ARGV = $x } 
    print if /./ && $h{$F[3]}
' intersect.RData Sample_hg19_mapped.bed
  • 我们在BEGIN
  • 的哈希映射中加载intersect.RData
  • 在主体中,我们检查Sample_hg19_mapped.bed文件中的第三个字段是否存在于哈希映射中。如果是,则打印该行。
  • 如果输出看起来不错,那么您可以重定向到另一个文件。