/ / Drukuj do pliku wyjściowego - bash, perl

Drukuj do pliku - bash, perl

Próbuję znaleźć przecinające się linie między dwoma plikami. Jednym z plików jest "Sample_hg19_mapped.bed", a drugi "intersect.RData" zawiera niektóre z tych samych danych, co pierwszy.

Plik łóżka:

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 -

Plik 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

I jako wynik, musi podać linięPlik BED, który ma taką samą wartość w pliku RData.file. Na przykład pierwsza i druga wartość RData istnieje w pliku BED, ale nie w trzeciej, więc w wynikach musi być:

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

Udało mi się to z tymi kodami:

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

Ale te linie, które pasują, są na ekranie i chcę, żeby były w pliku, ale nie mogę utworzyć pliku wyjściowego. Próbowałem tego, zmieniając wiele:

####!/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 "donen";

Ale mam tak wiele błędów, jak:

/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 {"

Czy możesz mi w tym pomóc? Dziękuję bardzo

Odpowiedzi:

0 dla odpowiedzi № 1

Jeśli twoje polecenie działa, ale wychodzi na ekran, po prostu przekieruj je do pliku:

command > output.txt

na przykład

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

Jeśli chcesz usunąć wszystkie puste linie, które możesz dodać next if /^s*$/; na początek:

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

Pominie to wszelkie linie wejściowe, które są tylko białymi znakami.


0 dla odpowiedzi nr 2

Twój kod jest niechlujny, a eros jest stamtąd, ale jeśli chcesz wyprowadzić do pliku, możesz to zrobić:

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

0 dla odpowiedzi № 3

Spróbuj z tym:

To wykorzystuje twoje wartości RData jako klucze mieszające, a następnie wyszukuje je w pliku bed, drukując wszelkie dopasowania do "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
}

0 dla odpowiedzi nr 4

Następujące perl One-liner powinien zrobić to, czego potrzebujesz:

perl -lane"
BEGIN { $x = pop; %h = map { chomp; $_ => 1 } <>; @ARGV = $x }
print if /./ && $h{$F[3]}
" intersect.RData Sample_hg19_mapped.bed
  • Ładujemy przecinek.RData w mapie mieszania w BEGIN blok
  • W głównym korpusie sprawdzamy, czy trzecie pole z pliku Sample_hg19_mapped.bed jest obecne w naszej mapie mieszania. Jeśli tak, wydrukuj linię.
  • Jeśli wynik wygląda dobrze, możesz przekierować do innego pliku.