Stampa su file - bash, perl

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

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