Sto cercando di trovare linee intersecanti tra due file. Uno dei file è "Sample_hg19_mapped.bed" e l'altro "intersect.RData" ha alcuni degli stessi dati del primo.
File letto:
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 -
File 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
E come output, deve dare la linea diFile BED che ha lo stesso valore nel file RData.file. Ad esempio, il primo e il secondo valore di RData esistono nel file BED, ma non il terzo, quindi in output deve essere:
chrM 16376 16401 HWI-ST575:220:C2MMMACXX:3:1310:14517:85268 255 -
chrM 16352 16377 HWI-ST575:220:C2MMMACXX:3:2113:18341:36393 255 -
L'ho gestito con quel codice:
perl -ane "$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;" Sample_hg19_mapped.bed intersect.RData
Ma quelle linee che corrispondono sono sullo schermo e voglio che rimangano nel file ma non riesco a creare il file di output. Ho provato questo cambiando molto:
####!/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";
Ma ho così tanti errori come:
/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 {"
Puoi aiutarmi su questo? Grazie mille
risposte:
0 per risposta № 1Se il tuo comando funziona ma viene visualizzato sullo schermo, devi semplicemente reindirizzare quello a un file:
command > output.txt
per esempio.
perl -ane "$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;" Sample_hg19_mapped.bed intersect.RData > output.txt
Se si desidera rimuovere tutte le linee vuote è possibile aggiungere next if /^s*$/;
all'inizio:
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
Questo salterà tutte le linee di input che sono solo spazi bianchi.
0 per risposta № 2
Il tuo codice è un po 'disordinato e le correzioni sono da lì, anche se se vuoi esportare in un file puoi farlo:
open (MYFILE, ">>NameOfFile");
print MYFILE $variable
0 per risposta № 3
Provare con questo:
Questo utilizza i valori RData come chiavi hash, quindi li cerca nel file bed, stampando eventuali corrispondenze su "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 per risposta № 4
Il seguente perl
one-liner dovrebbe fare quello che ti serve:
perl -lane"
BEGIN { $x = pop; %h = map { chomp; $_ => 1 } <>; @ARGV = $x }
print if /./ && $h{$F[3]}
" intersect.RData Sample_hg19_mapped.bed
- Carichiamo il intersect.RData in una mappa di hash nel
BEGIN
bloccare - Nel corpo principale controlliamo se il terzo campo del file Sample_hg19_mapped.bed è presente nella nostra mappa di hash. Se lo fa, stampa la linea.
- Se l'output ti sembra soddisfacente, puoi reindirizzare a un altro file.