[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] comparar arquivos e excluir linhas
From: |
jimmy |
Subject: |
Re: [shell-script] comparar arquivos e excluir linhas |
Date: |
Sun, 25 Dec 2011 00:11:14 -0200 |
User-agent: |
mutt-ng/devel-r804 (Linux) |
Saudações Sergio,
On Sat, Dec 24, 2011 at 03:38:27PM -0000, sergio wrote:
> Caros, um feliz natal e um bom ano novo. Boas festas e saude.
> tenho 1 arquivo a com 49000 linhas e um b com 100000.
> o arquivo a tem uma sequencia de numeros que corresponde a linha do arquivo b.
> exemplo
>
> arquivo a arquivo b
> 1 50
> 227 90
> 228 1000
> 229 30
> 300 ... 60 ...
>
> preciso ler a linha 1 do arquivo a e pegar o valor da linha 1 no arquivo b.
> ler o valor da linha 2 no arquivo a e pegar o valor da linha 227 no arquivo b
> e
> assim vai.
> fiz um for e demora muito, pois vai de linha em linha.
Abrir o arquivo, deslocar o ponteiro da linha 1 até a posição e repetir
a mesma operação para cada arquivo é bastante ineficiente. O ideal seria
abrir os arquivos e armazenar os valores para lê-los apenas uma vez cada.
> alguém tem uma idéia pra me ajudar?
>
> o arquivo a é uma referencia (posição da linha que preciso do arquivo b), sao
> 96
> arquivos b.
Assumindo que pretende processar todos os 96 arquivos de uma só vez,
criei o seguinte script em gawk:
#!/bin/gawk -f
{
if ( FILENAME == "A" ) {
array[$0] = i++;
last_record = $0;
}
else{
OFS = ( FILENAME == ARGV[ARGC] ) ? "\n" : "\t";
if ( FNR > last_record ) {
nextfile;
}
if ( FNR in array ) {
record[array[FNR]] = \
( record[array[FNR]] ) ? record[array[FNR]] OFS $0 : FNR "\t"
$0;
}
}
}
END {
for ( i = 0; i <= length(record); i++ ) {
print record[i];
}
}
A ideia é armazenar as referências num array, ler os demais arquivos e
armazenar o valor dessas referências noutro array, imprimindo tudo ao
final. É possível implementar a mesma coisa usando qualquer shell com
suporte a arrays.
Caso não seja possível usar arrays, grave em arquivo os resultados.
Podemos criar um "script criador de scripts" a partir do arquivo A com o
sed para identificar as linhas dos demais arquivos e gravar os
resultados em arquivos separados, por exemplo:
$ sed -s -ne "$(sed 's/.*/&w&/' A)" B*
os arquivos criados terão como nome o número da linha e o conteúdo de
todas as linhas correspondentes de todos os arquivos.
> obrigado a todos
[]'s.
--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com