Jump to content
ssofia

Comparar linha de ficheiro com outro ficheiro completo

Recommended Posts

ssofia

Ola

Eu vou iniciar um codigo para ler um ficheiro_1 que tem esta estrutura:

atatacacacatacat

taccagatacagatc

acagatacagtatag

gcccagatagacac

e de seguida ele vai procurar no ficheiro_2 (ficheiro com varias sequencias) se a linha 1 do ficheiro_1 existe no ficheiro_2, depois procura se linha 2 se encontra no ficheiro_2 e assim ate ao fim do ficheiro_1....

Se ele encontrar a sequencia ele guarda em COM.txt se nao ele guarda em NOV.txt

Eu estruturei algo do genero o que vos parece? o que acham que devo modificar no codigo? Obrigado

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....Se sim guardar em livraria_comment se nao existir guardar na livraria_nova


my $f1 = shift || "/Users/ssofia/Desktop/test1.txt";
my $f2 = shift || "/Users/ssofia/Desktop/test2.txt";

my $outfile_1 = "/Users/ssofia/Desktop/RESULTS_1.txt";
my $outfile_2 = "/Users/ssofia/Desktop/RESULTS_2.txt";

my %results;


open my $file1, '<', $f1;

while (my $line = <$file1>) {

 $results{$line} = 1

}


open my $file2, '<', $f2;

while (my $line = <$file2>) {

 $results{$line}++

}


open (OUTFILE, ">$outfile_1") or die "Cannot open $outfile for writing \n";
open (OUTFILE, ">$outfile_2") or die "Cannot open $outfile for writing \n";



if ($line_file1 eq $file2) {

 OUTFILE $line_file1 ">$outfile_1" ;

} else {

 print OUTFILE $line_file1 ">$outfile_2";

}

Edited by Rui Carlos
geshi

Share this post


Link to post
Share on other sites
eatg75

Oi bom dia.

#!/usr/bin/perl

use feature qw(:5.10); # para poder utilizar novas funcionalidades implementadas a partir do Perl 5.10+
				                # recomendava-te a utilizar este pragma sempre. Este pragma e equivalente ao "use v5.10".
				                # Para utilizares este pragma a tua versao do Perl deve ser 5.10+, se a tua versao do Perl
							    # for por exemplo 5.12 podes utilizar este pragma ou este aqui "use feature qw(:5.12);"
use strict;
use warnings;
use autodie;
# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....Se sim guardar em livraria_comment se nao existir guardar na livraria_nova

# recomendava utilizares os o Getopt::Long, mesmo para um script pequeno como este. para mais informacoes utiliza o comando "perldoc Getopt::Long".
my $f1 = shift || "/Users/ssofia/Desktop/test1.txt";
my $f2 = shift || "/Users/ssofia/Desktop/test2.txt";
my $outfile_1 = "/Users/ssofia/Desktop/RESULTS_1.txt";
my $outfile_2 = "/Users/ssofia/Desktop/RESULTS_2.txt";
my %results;

open my $file1, '<', $f1; # e uma boa pratica se definises os nomes para FILE_HANDLES em maiusculas
					  # tambem seria uma boa pratica se verificasses um ficheiro existe antes de o abrires para leitura
					  # podias fazer algo como :
					  # open my $FILE_1, "<", $f1 if -f $f1;
while (my $line = <$file1>)
{
chomp $line; # remover o "\n" da linha, assim como a leitura a partir do STDIN
			 # se estas a ler algo a partir do teclado ou ficheiro tens de remove o carater "\n" do final da linha
			 # ou valor introduzido pelo teclado

$results{$line} = 1
}

open my $file2, '<', $f2;
while (my $line = <$file2>)
{
chomp $line; # nao te esquecas do chomp!
$results{$line}++
}
# nestas duas linhas nao precisas do die() pois estas a usar o pragma "use autodie", o qual chama die() implicitamente
# nas situacoes de erro.
# Estas a utilizar o mesmo FILE_HANDLE para dois ficheiros distintos! O que o open() faz e abre/cria (se nao existir) o ficheiro cujo nome
# esta $outfile_1 utilizando o FILE_HANDLE OUTFILE, e imediatamente a sequir voltas a chamar o open() com o mesmo FILE_HANDLE que chamaste o
# open() anteriormente o que torna a chamada a primeira chamada ao open() sem sentido! Pois ao chamares o open pela segunda vez com um FILE_HANDLE
# aberto este e fechado de forma a ser utilizado para abrir o outro ficheiro.
open (OUTFILE, ">$outfile_1") or die "Cannot open $outfile for writing \n"; # esta linha podia ficar assim :
																		# open my $OUT_11_FH, ">", "$outfile_1";
open (OUTFILE, ">$outfile_2") or die "Cannot open $outfile for writing \n"; # open my $OUT_2_FH, ">", "$outfile_2";

# tens 3 erros aqui
# 1 -> $line_file1 nao existe (lembra que estas a utilizar o pragma strict)
# 2 -> pelo nome da variavel "$line_file1" suponho que querias que a variavel tivesse o valor de uma linha e estas
#a compata-la com o um FILE_HANDLE
# 3 -> falta a funcao print() na instrucao dentro do if.
if ($line_file1 eq $file2) {

OUTFILE $line_file1 ">$outfile_1" ; # podia assim : say OUTFILE "$line_file1 >$outfile_1";
} else {
print OUTFILE $line_file1 ">$outfile_2"; # recomendava-te a funcao say() ao inves do print(), pois com say()
# nao escreve o carater "\n" no final (a nao ser se inicializares a "Perl Var"
# $\ = "\n";
}

Edited by eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Share this post


Link to post
Share on other sites
eatg75

Hey fiz uma dummy implementacao do que querias eis o codigo:

#!/usr/bin/env perl
use feature qw(:5.12); # utilzar a versao 5.12 do perl
use strict;
use warnings;
use autodie; # die() implicito em situacoes de erro.

use Getopt::Long; # parser das opcoes da linda de command
use Pod::Usage; # para o manual de utilizacao deste script

# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....
# Se sim guardar em livraria_comment se nao existir guardar na livraria_nova

# opcoes da linha de comando
my %options = (
file_1 =>  "/Users/ssofia/Desktop/test1.txt", # ficheiro por omissao
file_2 => "/Users/ssofia/Desktop/test2.txt", # ficheiro por omissao
matched_lines_file => "COM.txt", # contem linhas do file_1 encontradas no file_2
unmatched_lines_file => "NOV.txt", # contem linhas do file_2 nao encontradas no file_2,
help => 0, # invoca a documentacao completa deste script
usage => 0, # mostra o resumo deste script
);

my %file_2_lines;

GetOptions
"file-one=s" => \$options{file_1},
"file-two=s" => \$options{file_2},
"matched-lines-file=s" => \$options{matched_lines_file},
"unmatched-lines-file=s" => \$options{unmatched_lines_file},
"usage" => \$options{usage},
"help" => \$options{help} || pod2usage 2;

pod2usage 2 if $options{usage};
pod2usage 1 if $options{help};

# verifica se os argumentos passados sao ficheiros regulares, termina o programa caso a verificacao falhar
die "'$options{file_1}' nao existe!\n" unless -f $options{file_1}; # o "\n" apenas para impedir o die() de escrever para o STDOUT a linha com erro
die "'$options{file_2}' nao existe!\n" unless -f $options{file_2};

open FILE_2_FH, "<", "$options{file_2}";

# le o ficheiro e insere cada linha no hash
while (my $line = <FILE_2_FH>)
{
next unless $line =~ /^\w+/; # ignora linhas vazias, e seguro fazer isto antes do chomp() pois o "\n" nao e um carater elemento da classe \w
chomp $line;
$line =~ s/^\s+//; # remove espacos no inicio da linha
$line =~ s/\s+$//; # remove espacos no fim da linha
$file_2_lines{$line} = 1; # valor guardado e irelevante, o importante e a chave!
}

close FILE_2_FH;

open FILE_1_FH, "<", "$options{file_1}";
open MATCHED_LINES_FH, ">", "$options{matched_lines_file}";
open UNMATCHED_LINES_FH, ">", "$options{unmatched_lines_file}";

while (my $line = <FILE_1_FH>)
{
next unless $line =~ /^\w+/;
chomp $line;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
if (exists $file_2_lines{$line}) { say MATCHED_LINES_FH "+>$line"; }
else { say UNMATCHED_LINES_FH "->$line"; }
}

# fecha os FileHandles abertos
close FILE_1_FH;
close MATCHED_LINES_FH;
close UNMATCHED_LINES_FH;

# Manual de Ajuda
__END__
=head1 NAME
larry - procura ocorrencias de linhas de um ficheiro no outro.
=head1 SYNOPSIS
larry [options]... [ file]...
 Options:
--file-one=File1
		o primeiro ficheiro.
--file-two=File2
		o segundo ficheiro.
--matched-lines-file=Mached
		ficheiro que ira guardar as linhas encontradas
--unmatched-lines-file=Unmatced
		ficheiro que ira guardas as linhas nao encontradas
--usage
		mostra uma breve ajuda.
--help	
		mostra a ajuda completo.
=head1 OPTIONS
=over 8
=item B<--help>
mostra a ajuda para invocar este script
=item B<--usage>
mostra uma breve discricao do script
=item B<--file-one>
ficheiro qual as suas linhas serao procuradas no B<--file-two>
=item B<--file-two>
ficheiro o qual sera procurado ocorrencias das lindas do B<--file-one>.
=item B<--matched-lines-file>
ficheiro para guardara as linhas de B<--file-one> que existem no B<--file-two>.
=item B<--unmatched-lines-file>
ficheiro que guardara as linhas de B<--file-one> que nao existem no B<--file-two>.
=head1 DESCRIPTION
larry - procura ocorrencias de linhas de um ficheiro no outro
=back
=cut

Edited by eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.