Bash 打印输出文件

Bash 打印输出文件,bash,perl,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

我试图找到两个文件之间的相交线。其中一个文件是“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
作为输出,它需要给出BED文件的行,该行在RData.file中具有相同的值。例如,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 {'
你能帮我一下吗?
非常感谢

如果您的命令正常工作但输出到屏幕,只需将其重定向到文件:

command > output.txt
e、 g

如果要删除所有空行,可以添加
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

这将跳过所有仅为空白的输入行。

您的代码有点凌乱,错误就在那里,但如果您想输出到文件,可以执行以下操作:

 open (MYFILE, '>>NameOfFile');
 print MYFILE $variable
试试这个:

这将使用RData值作为散列键,然后在bed文件中查找它们,并将任何匹配项打印到“output.txt”

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 
}
使用严格;
使用警告;
使用自动模具;
打开我的$bed,,'output.txt';
while(){
咀嚼;
下一步除非/chrM/;
我的@split=split/\t/;
如果$rdata{$split[3]}将第四列与%rdata中的键匹配的任何行打印到output.txt,则打印$out_文件“$\n”
}

以下
perl
一行程序可以满足您的需要:

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

因此,我应该这样做:perl-ane'$f=$f[0]。$f[1];如果$k{$f},“Sample_hg19_mapped.bed intersect.RData”$k{$f}=${print“$k{$f}${”}否则{print“epic fail”}打开(MYFILE,“>>output.txt”)或死亡“无法打开>output.txt:$!”;打印MYFILE关闭$f;打印“完成”\n;不是内塞拉里。您可以在脚本顶部打开文件(open(MYFILE,'>>NameOfFile');当您想在文件内部而不是在命令行中打印时,只需执行“打印我的文件,而不是打印您想打印的内容”“明白了!非常感谢您提供的信息和您的支持help@podeeng当您尝试它时会发生什么?从命令行运行此命令会为我创建文件。它创建了一个文件,但它丢失了。它会将输出提供给“head output.txt”,而不是“tail output.bed”你的意思是
tail output.txt
?当我尝试下一个if/^\s*$/,我也能看到尾部!所以,它工作了!耶!非常感谢!@podeeng太好了!如果问题解决了,别忘了接受答案:非常感谢。但是我在你的脚本中找不到BED文件的部分因为我的目录中有这么多BED文件,如何使其具体化?
打开我的$file',当然..我尝试了你的脚本,它给出了很多错误,我不明白为什么..-->/var/spool/slurmd/job2573679/slurm\u脚本:第3行:使用:未找到命令/var/spool/slurmd/job2573679/slurm\u脚本:第4行:使用:未找到命令/var/spool/slurmd/job2573679/slurm_脚本:第5行:用法:未找到命令无法获取引用控制台的文件描述符无法获取引用控制台的文件描述符/var/spool/slurmd/job2573679/slurm_脚本:第11行:意外标记附近的语法错误
%bed',/var/spool/slurmd/job2573679/slurm_脚本:第11行:
my(%bed,%rdata)“你的脚本顶部有什么?应该是
!/usr/bin/perl
oy!它是!/bin/bash。我会更改它的。非常感谢你的解释!我会正确地尝试它away@podeeng当然,如果您有任何问题,请随时留下评论。我仍在等待代码完成,我希望它能工作!(看起来还不错)我会的!对自己放松点@podeeng。对于第一次问问题的人来说,你做得很好,所以+1。谢谢你的激励^^
perl -lane'
    BEGIN { $x = pop; %h = map { chomp; $_ => 1 } <>; @ARGV = $x } 
    print if /./ && $h{$F[3]}
' intersect.RData Sample_hg19_mapped.bed