Lire plusieurs fichiers dans un répertoire et comparer avec un autre fichier

J’ai deux fichiers

File 1 in reading directory is of following format Read 1 AT Read 3 TC Read 5 GT Read 7 AG Read 10 AG Read 12 CG File 2 in directory contains Read 5 AG Read 6 TC Read 7 GA Read 8 GA Read 20 AT 

Fichier2 contient

 1 2 3 4 5 6 7 

Je dois d’abord lire le fichier 2 pour les positions et imprimer la valeur correspondante du fichier ouvert dans le répertoire de manière horizontale. S’il n’y a pas de correspondance pour cette position, elle est imprimée comme “-“. Le résultat pour ci-dessus devrait être

  1 2 3 4 5 6 7 Read T - C - T - G Read - - - - GCA 

Je dois le faire pour tous les fichiers et imprimer dans le format ci-dessus dans une autre ligne. la sortie ne sera donc qu’un fichier avec un nombre de lignes égal à aucun des fichiers. Puis-je faire cela en Perl facilement?

Si la taille des fichiers est petite, vous pouvez les lire en mémoire:

 #read input files use IO::File; my $file1_data; open(my $file1_fh,"<","/path/file1.data") or die $!; #read file1 while(my $line=<$file1_fh>){ chomp($line); my ($read,$pos,$col1,$col2) = split(/ /,$line); $file1_data->{$pos} = [$col1,$col2]; } #read file2 my $file2_data; open(my $file2_fh,"<","/path/file2.data") or die $!; while(my $line=<$file2_fh>){ chomp($line); my ($read,$pos,$col1,$col2) = split(/ /,$line); $file2_data->{$pos} = [$col1,$col2]; } #read pos file my @positions; while(my $pos=<$posfile_fh>){ chomp($pos); push(@positions,$pos) } foreach my $pos (@positions){ print "$pos\t"; } print "\n"; foreach my $pos (@positions){ my $data = defined $file1_data->{$pos}->[0]?$file1_data->{$pos}->[0]:"-"; print "$pos\t$data" } print "\n"; foreach my $pos (@positions){ my $data = defined $file2_data->{$pos}->[0]?$file2_data->{$pos}->[0]:"-"; print "$pos\t$data" } print "\n"; 

Autant que je sache, vous utilisez uniquement la deuxième colonne de données. Voici un simple programme Perl pour faire cela, si vous avez des questions, n’hésitez pas à demander. J’ai utilisé un troisième fichier d’entrée et il est possible d’utiliser autant de fichiers que vous le souhaitez. J’ai changé le format pour inclure 42 à la fin.

Le code:

 #!/usr/bin/env perl use ssortingct; use warnings; use autodie; # try to open format file my $ffn = shift @ARGV or die "you didn't provide a format file name!\n"; open my $ffh, '<', $ffn; # read format file my @format = <$ffh>; close $ffh; chomp for @format; # get rid of newlines # prepare output print ' ' . join(' ' => @format) . "\n"; # iterate over all .txt files in the data directory foreach my $data_fn () { # iterate over all lines of the data file open my $data_fh, '<', $data_fn; my %data = (); foreach my $line (<$data_fh>) { # parse input lines (only) next unless $line =~ /Read (\d+) ([ACGT]) ([ACGT])/; my ($pos, $first, $second) = ($1, $2, $3); # store data $data{$pos} = $second; } # print summary print 'Read ' . join(' ' => map {$data{$_} // '-'} @format) . "\n"; } 

Le résultat:

 $ perl bio.pl format.txt 1 2 3 4 5 6 7 42 Read T - C - T - G - Read - - - - GCA - Read - C - T - - - A 

HTH! 🙂