Ich versuche, Schnittlinien zwischen zwei Dateien zu finden. Eine der Dateien ist "Sample_hg19_mapped.bed" und die andere "intersect.RData" enthält einige der gleichen Daten wie die erste.
Bettdatei:
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-Datei:
HWI-ST575:220:C2MMMACXX:3:1310:14517:85268
HWI-ST575:220:C2MMMACXX:3:2113:18341:36393
HWI-ST575:220:C2MMMACXX:3:2113:45341:56393
Und als Ausgabe muss es die Zeile von gebenBED-Datei, die den gleichen Wert in der RData.file hat. Zum Beispiel ist der erste und der zweite Wert von RData in der BED-Datei vorhanden, nicht jedoch der dritte. Daher muss er in der Ausgabe Folgendes sein:
chrM 16376 16401 HWI-ST575:220:C2MMMACXX:3:1310:14517:85268 255 -
chrM 16352 16377 HWI-ST575:220:C2MMMACXX:3:2113:18341:36393 255 -
Ich habe es mit diesem Code geschafft:
perl -ane "$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;" Sample_hg19_mapped.bed intersect.RData
Diese Zeilen sind jedoch auf dem Bildschirm und ich möchte, dass sie in der Datei bleiben, aber ich kann die Ausgabedatei nicht erstellen. Ich habe dies versucht, indem ich viel geändert habe:
####!/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";
Ich habe aber so viele Fehler wie:
/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 {"
Kannst du mir vielleicht dabei helfen? Ich danke dir sehr
Antworten:
0 für die Antwort № 1Wenn Ihr Befehl funktioniert, aber auf dem Bildschirm ausgegeben wird, leiten Sie das einfach in eine Datei um:
command > output.txt
z.B.
perl -ane "$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;" Sample_hg19_mapped.bed intersect.RData > output.txt
Wenn Sie alle leeren Zeilen entfernen möchten, können Sie sie hinzufügen next if /^s*$/;
zum start:
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
Dadurch werden alle Eingabezeilen übersprungen, die nur Leerzeichen sind.
0 für die Antwort № 2
Ihr Code ist etwas chaotisch und die Fehler stammen von dort. Wenn Sie jedoch eine Datei ausgeben möchten, können Sie Folgendes tun:
open (MYFILE, ">>NameOfFile");
print MYFILE $variable
0 für die Antwort № 3
Probieren Sie es aus:
Dabei werden Ihre RData-Werte als Hash-Schlüssel verwendet und dann in der Bettdatei nach ihnen gesucht und Übereinstimmungen in "output.txt" gedruckt.
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 für die Antwort № 4
Folgende perl
Einliner sollte das tun, was Sie brauchen:
perl -lane"
BEGIN { $x = pop; %h = map { chomp; $_ => 1 } <>; @ARGV = $x }
print if /./ && $h{$F[3]}
" intersect.RData Sample_hg19_mapped.bed
- Wir laden die intersect.RData in einer Hash-Map im
BEGIN
Block - Im Hauptteil überprüfen wir, ob das dritte Feld der Datei Sample_hg19_mapped.bed in unserer Hash-Map vorhanden ist. Wenn dies der Fall ist, drucken Sie die Zeile aus.
- Wenn die Ausgabe für Sie in Ordnung ist, können Sie in eine andere Datei umleiten.