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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Filtrar arquivos...


From: Junior
Subject: Re: [shell-script] Filtrar arquivos...
Date: Fri, 22 Dec 2000 14:01:13 -0200

Muito obrigado Eliphas vc me entendeu certinho =)

-- 
/*
If it happens once, it's a bug.
If it happens twice, it's a feature.
If it happens more than twice, it's windows.
*/

From (no email address) Fri Dec 22 11:05:41 2000
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-6_3_1_3); 22 Dec 2000 19:05:41 -0000
Received: (qmail 72163 invoked from network); 22 Dec 2000 19:05:41 -0000
Received: from unknown (10.1.10.142) by l8.egroups.com with QMQP; 22 Dec 2000 
19:05:41 -0000
Received: from unknown (HELO burns.conectiva) (200.250.58.146) by mta3 with 
SMTP; 22 Dec 2000 20:06:44 -0000
Received: (qmail 21562 invoked by uid 0); 22 Dec 2000 19:05:32 -0000
Received: from verde.distro.conectiva (10.0.17.77) by burns.conectiva with 
SMTP; 22 Dec 2000 19:05:32 -0000
Date: Fri, 22 Dec 2000 17:09:24 -0200 (EST)
X-Sender: aurelio@verde.distro.conectiva
To: address@hidden
Subject: comm - Re: [shell-script] Filtrar arquivos...
In-Reply-To: <Pine.LNX.4.31.0012212236070.8134-100000@lilica.distro.conectiva>
Message-ID: <Pine.LNX.4.21.0012221650380.11983-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
From: # aurelio marinho jargas <address@hidden>


dá pra usar o comm também

[~] comm --help
Uso: comm [OPÇÃO]... ARQUIVO1 ARQUIVO2
Compara os arquivos ordenados ARQUIVO1 e ARQUIVO2, linha por
linha.

  -1              suprime as linhas que só estão em ARQUIVO1
  -2              suprime as linhas que só estão em ARQUIVO2
  -3              mostra as linhas que só estão em um deles
      --help      mostra esta ajuda e finaliza
      --version   informa a versão e finaliza

Comunicar `bugs' para <address@hidden>.



veja lá:

[~] echo -e "aaa\neee\niii" > a
[~] echo -e "aaa\nooo\nuuu" > b
[~] echo -e "aaa\nuuu" > c
[~] comm -3 a c
eee
iii
        uuu
[~] comm -3 a b
aaa
eee
iii
        ooo
        eee


então o comm com a opção -3 mostra na primeira coluna linhas que
só estão no primeiro arquivo, e na segunda coluna, linhas que só
estão no segundo (ele bota um TAB na frente).

então basta 'grepar' as linhas que têm TAB 

  comm -3 db.txt 1.txt >  tmp
  comm -3 db.txt 2.txt >> tmp
  grep '^I' tmp | sort > carinhas-fora-da-agenda

caso ainda queira tirar os TABs do arquivo final:

  sed 's/\t//' carinhas-fora-da-agenda > carinhas-sem-TAB


* OBS.: no grep o ^I é um TAB literal (ctrl+v, <TAB>)
* OBS2: é claro, o grep pode ser substituído por 
        sed '/^I/!d' tmp
        &:)


@ 21/12, Eliphas Levy Theodoro:

> Luciano Machado Granella, @ 22:17:
> 
> > Os arquivos estão ordenados? Se estiverem, o trabalho será mais simples.
> > Usando PERL, você poderia carregar os dois primeiros arquivos em dois
> > vetores e comparar todo_mundo_1 com todo-mundo_2 e gerar um terceiro vetor
> > só sem nomes repetidos. O arquivo db.txt vc carrega num quarto vetor a ser
> > comparado com o terceiro vetor (1.txt + 2.txt sem repetição). O que estiver
> > no quarto vetor (db.txt) e não estiver no terceiro vetor, deve ir para
> > filtrado.txt.
> 
> Com certeza, sem ordenação vai dar um trabalho danado. Ordenando os
> arquivos antes (com o sort), você pode usar o 'diff' pra fazer o
> trabalho, bem fácil.
> 
> > Junior wrote:
> >
> > > Ola galera !
> > > tenho 3 arquivos (1.txt, 2.txt, db.txt) contendo nomes
> > > e fazer compracoes do tipo:
> > > o conteudo de 1 que nao tiver em db jogo pra o filtrado.txt
> > > o conteudo de 2 que nao tiver em db jogo pra o filtrado.txt
> > > Porem o filtrado nao podera ter linhas repetidas...
> > > Alguma luz ???
> 
> vamos ver se eu entendi essa:
> 
> $ cat arq1.txt
> joao
> maria
> joaquim
> jose
> pedro
> $ cat arq2.txt
> manoel
> paulo
> marcelo
> ana
> luis
> 
> como você não quer diferenciação do que é do primeiro ou do segundo
> arquivo, vamos juntar e ordenar, e jogar em um arquivo temporário:
> 
> $ sort arq1.txt arq2.txt > temp
> 
> vamor ordenar o db também, mas a saída pode ir direto para o diff:
> 
> $ sort db.txt | diff - temp
> 2d1
> < eliphas
> 3a3
> > joaquim
> 6a7
> > marcelo
> 
> o arquivo "db.txt" tem o conteúdo do arq1 e arq2, menos joaquim e marcelo,
> mais 'eliphas', só pra complicar; sendo que 'eliphas' está no primeiro
> arquivo (sinal menor que), e os outros no segundo arquivo (maior que).
> 
> como queremos só o que tem no primeiro arquivo, vamos fazer um sed
> esperto: "procure por linhas começando com '>', remova '> ' e imprima."
> 
> $ sort db.txt | diff - temp | sed -n '/^>/s/> //p'
> joaquim
> marcelo
> 
> prontinho. redirecione pra um arquivo:
> 
> $ sort db.txt | diff - temp | sed -n '/^>/s/> //p' > filtrado.txt
> 
> ah, você tem que ter certeza que o arquivo filtrado não tem repetições:
> 
> $ sort db.txt | diff - temp | sed -n '/^>/s/> //p' | sort -u > filtrado.txt
> 
> se eu entendi bem, é isso aí.
> 
> ah! esqueci de algo importante:
> 
> $ rm -f temp
> não deixe lixo em casa ;)
> 
> sed u later,
> 

-- 
s·:(·>(·×^a]×http://www.verde666.org×^[:wq



reply via email to

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