/ / Print to out Datei - bash, perl

In Datei ausgeben - bash, perl

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 № 1

Wenn 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.