shell-script-pt
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]