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 № 1Jeś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.