Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Gunther Furtado escreveu: Em Sat, 5 Jul 2008 00:48:03 -0300 (BRT) [EMAIL PROTECTED] escreveu: [...] Indo um pouco mais além, pode-se ainda criar um while read linha para pegar cada linha, decompor esta em colunas, pegar uma coluna e comparar com as demais, podendo a primeira coluna ser ignorada (uma linha só): cat arquivo.txt | while read linha; do coluna=($linha); [EMAIL PROTECTED]; for ((i=1; icolunas-1; i++)); do for ((j=i+1; jcolunas; j++)); do if ((coluna[i]==coluna[j])); then echo $linha; i=colunas; break; fi; done; done; don [...] Já ao substituir números por letras e removendo o nome de cada linha, temos o seguinte: $ cat teste.txt | while read linha; do coluna=($linha); [EMAIL PROTECTED]; for ((i=1; icolunas-1; i++)); do for ((j=i+1; jcolunas; j++)); do if ((coluna[i]==coluna[j])); then echo $linha; i=colunas; break; fi; done; done; done C C D E B C D E D D E F D E F G Aqui, quando faço i=1 já estou ignorando a primeira coluna, portanto, ou deixa os nomes das colunas ou faça i=0 para começar a comparação a partir da primeira coluna. ;-) Porém aqui tem uma ressalva devido a caracteres reservados do bash que podem estar na linha, o que pode/vai causar erros. Isso também poderia ser feito usando a comparação por expr: cat arquivo.txt | while read linha; do echo -n $linha = ; for coluna in $linha; do if expr $linha : .*\$coluna\.*\$coluna\.* /dev/null; then echo -n $coluna = $linha; break; fi; done; echo; done Este funcionou perfeitamente se houver somente uma repetição por linha! em um arquivo como este aí embaixo [...] Este funcionou pelo fato de aqui com expr não estou ignorando a primeira coluna na comparação. Mas ainda acho mais lógico controlável o método anterior, opinião minha... Se ainda assim tiver problemas, relate melhor os problemas que proporemos uma ajuda para encontrar a melhor solução. Trata-se de uma coleção de aproximadamente 700 imagens separadas em 47 sub-conjuntos. Serão, em sua maioria, itens catalogados como K 1314 ou F 2241 e é preciso determinar: i) se algum destes itens se repete dentro de um dos sub-conjuntos; e ii) se se algum destes itens se repete fora de um dos sub-conjuntos, preciso saber em quais destes sub-conjuntos isto ocorre. Desculpe, mas não entendi muito bem... As colunas são compostas por 1 (uma) letra, 1 (um) espaço e 4 (quatro) dígtos, respeita sempre este padrão? Cada subconjunto é uma linha no arquivo? Se sim, a primeira linha é o nome de cada subconjunto? Se cada linha for um subconjunto, o (i) fica fácil pelo que já raciocinamos, mas o (ii) me parece um tanto estranho o enunciado, seria pegar todos os itens e ver em quais subconjuntos eles aparecem? Ou somente em quais subconjuntos este determinado item aparece mais de uma vez? []'s Junior Polegato
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Fazia tempo que eu não esquecia de tirar o pedido de confirmação para leitura, essa última passou. Desculpe-me a falha (estou parecendo a Telefônica - rsrsrs). []'s Junior Polegato -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
2008/7/7 Junior Polegato - Linux [EMAIL PROTECTED]: [...] Desculpe, mas não entendi muito bem... As colunas são compostas por 1 (uma) letra, 1 (um) espaço e 4 (quatro) dígtos, respeita sempre este padrão? Cada entrada é composta por uma letra e quatro dígitos, o espaço é deprezável. Cada subconjunto é uma linha no arquivo? Se sim, a primeira linha é o nome de cada subconjunto? Se cada linha for um subconjunto, o (i) fica fácil pelo que já raciocinamos, mas o (ii) me parece um tanto estranho o enunciado, seria pegar todos os itens e ver em quais subconjuntos eles aparecem? Ou somente em quais subconjuntos este determinado item aparece mais de uma vez? As colunas são capítulos de um livro nos quais figurarão imagens representadas pelos códigos de uma letra e quatro dígitos e o que preciso é conferir se a mesma imagem aparece em dois ou mais capítulos. Pensando bem, eu formulei a questão erradamente desde o princípio. Vou abrir um novo assunto para facilitar as buscas das gerações futuras! []'s Junior Polegato Abraço, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Teste ai! [EMAIL PROTECTED]:~/tmp$ cat teste.txt A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 7 [EMAIL PROTECTED]:~/tmp$ grep -E ([[:cntrl:]][[:digit:]])\1 teste.txt A 3 3 4 5 C 4 4 5 6 Att, Jarbas 2008/7/4 Gunther Furtado [EMAIL PROTECTED]: Olá, O tópico recente que tratava do awk me deixou curioso para saber se ele resolverá um problema para mim, com a ajuda de vocês, é claro: A 3 3 4 5 B2 3 4 5 C 4 4 5 6 D 4 5 6 7 Dado um arquivo entradas que contenha a informação acima, eu gostaria de imprimira as linha que contenham qualquer valor repetido, nem só o 3, nem só o 4. O resultado que espero é: $ awk '/alguma mágica/ { print $0 }' entradas A 3 3 4 5 C 4 4 5 6 ao invés de: $ awk '/3.*3/ { print $0 }' entradas A 3 3 4 5 $ awk '/4.*4/ { print $0 }' entradas C 4 4 5 6 O arquivo real é um pouco maior (47x15), com uns 700 valores diferentes e preciso de uma maneira rápida de descobrir se há valores que se repetem em qualquer de suas linhas. Gracias, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Em Fri, 4 Jul 2008 21:24:37 -0300 Rodrigo Escobar [EMAIL PROTECTED] escreveu: Opa.. cheguei agora aqui.. hehehe eh facinho brother.. vamos la.. Com algumas modificações, funcionou para valores numéricos. Lá vai a versão final: #!/bin/sh # [EMAIL PROTECTED], [EMAIL PROTECTED] arquivo=teste.txt # NOME DO ARQUIVO tamanho_final=9 # VALOR MAXIMO DENTRO DO ARQUIVO for ((tamanho_inicial = 1; tamanho_inicial $[tamanho_final + 1]; tamanho_inicial++)) do cat $arquivo |awk '/'$tamanho_inicial'.*'$tamanho_inicial'/' resultado done cat resultado |sort|uniq [...] Posta ai pra gente se vc tem numeros maiores que 9 que tentaremos achar uma outra solucao.. É pior ainda, são códigos alfanuméricos referentes a arquivos com imagens. Vou testar outras dicas e aviso quando tiver resultados. Grato a todos, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Em Sun, 6 Jul 2008 02:29:10 -0400 Jarbas Peixoto Júnior [EMAIL PROTECTED] escreveu: Teste ai! [EMAIL PROTECTED]:~/tmp$ cat teste.txt A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 7 [EMAIL PROTECTED]:~/tmp$ grep -E ([[:cntrl:]][[:digit:]])\1 teste.txt A 3 3 4 5 C 4 4 5 6 Bem, não produz qualquer saída... /tmp$ cat teste_NUM.txt A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 7 /tmp$ grep -E ([[:cntrl:]][[:digit:]])\1 teste_NUM.txt /tmp$ Gracias, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Em Sat, 5 Jul 2008 00:48:03 -0300 (BRT) [EMAIL PROTECTED] escreveu: [...] Olá, Com número até 9 (uma linha só): $ egrep '(0.*0|1.*1|2.*2|3.*3|4.*4|5.*5|6.*6|7.*7|8.*8|9.*9)' arquivo.txt De fato, funciona perfeitamente, para números de 0 a 9. Seguindo a mesma idéia, com números maiores até 99, deve-se envolver os números até 9 por \n\, por exemplo até 15 (uma linha só): $ egrep '(\0\.*\0\|\1\.*\1\|\2\.*\2\|\3\.*\3\|\4\.*\4\|\5\.*\5\|\6\.*\6\|\7\.*\7\|\8\.*\8\|\9\.*\9\|10.*10|11.*11|12.*12|13.*13|14.*14|15.*15)' arquivo.txt Claro que fazer na mão dá trampo, então para gerar a seqüência com todos envolvidos, pode-se usar (uma linha só): for i in `seq 0 n`; do echo -n \$i\.*\$i\|; done; echo Agora pode-se ainda abstrair e não colocar apenas números, pode ser letras também no lugar dos números na expressão regular do egrep. Indo um pouco mais além, pode-se ainda criar um while read linha para pegar cada linha, decompor esta em colunas, pegar uma coluna e comparar com as demais, podendo a primeira coluna ser ignorada (uma linha só): cat arquivo.txt | while read linha; do coluna=($linha); [EMAIL PROTECTED]; for ((i=1; icolunas-1; i++)); do for ((j=i+1; jcolunas; j++)); do if ((coluna[i]==coluna[j])); then echo $linha; i=colunas; break; fi; done; done; done Aqui, encontrei o seguinte problema: para um arquivo contendo as linhas abaixo, funciona perfeitamente. A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 7 Já ao substituir números por letras e removendo o nome de cada linha, temos o seguinte: $ cat teste.txt | while read linha; do coluna=($linha); [EMAIL PROTECTED]; for ((i=1; icolunas-1; i++)); do for ((j=i+1; jcolunas; j++)); do if ((coluna[i]==coluna[j])); then echo $linha; i=colunas; break; fi; done; done; done C C D E B C D E D D E F D E F G Porém aqui tem uma ressalva devido a caracteres reservados do bash que podem estar na linha, o que pode/vai causar erros. Isso também poderia ser feito usando a comparação por expr: cat arquivo.txt | while read linha; do echo -n $linha = ; for coluna in $linha; do if expr $linha : .*\$coluna\.*\$coluna\.* /dev/null; then echo -n $coluna = $linha; break; fi; done; echo; done Este funcionou perfeitamente se houver somente uma repetição por linha! em um arquivo como este aí embaixo C C D D B C D E D D E F D E F G a resposta é: C C D D = C = C C D D B C D E = D D E F = D = D D E F D E F G = Se ainda assim tiver problemas, relate melhor os problemas que proporemos uma ajuda para encontrar a melhor solução. Trata-se de uma coleção de aproximadamente 700 imagens separadas em 47 sub-conjuntos. Serão, em sua maioria, itens catalogados como K 1314 ou F 2241 e é preciso determinar: i) se algum destes itens se repete dentro de um dos sub-conjuntos; e ii) se se algum destes itens se repete fora de um dos sub-conjuntos, preciso saber em quais destes sub-conjuntos isto ocorre. PS: '\...\' é uma boa alternativa quando se trabalha com valores separados por caracteres não visíveis. []'s Junior Polegato Muito obrigado, Gunther Furtado -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Muito obrigado aos colegas! Assim que testar, aviso! Abraço, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
[assunto paralelo] imprimir linhas que contenham valores repetidos
Olá, O tópico recente que tratava do awk me deixou curioso para saber se ele resolverá um problema para mim, com a ajuda de vocês, é claro: A 3 3 4 5 B2 3 4 5 C 4 4 5 6 D 4 5 6 7 Dado um arquivo entradas que contenha a informação acima, eu gostaria de imprimira as linha que contenham qualquer valor repetido, nem só o 3, nem só o 4. O resultado que espero é: $ awk '/alguma mágica/ { print $0 }' entradas A 3 3 4 5 C 4 4 5 6 ao invés de: $ awk '/3.*3/ { print $0 }' entradas A 3 3 4 5 $ awk '/4.*4/ { print $0 }' entradas C 4 4 5 6 O arquivo real é um pouco maior (47x15), com uns 700 valores diferentes e preciso de uma maneira rápida de descobrir se há valores que se repetem em qualquer de suas linhas. Gracias, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Opa.. cheguei agora aqui.. hehehe eh facinho brother.. vamos la.. Depende da faixa de valores que vc tem dentro do arquivo.. mas vou dar exemplo do que criei aqui.. [EMAIL PROTECTED]:/home/rodrigo]$ cat num A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 4 E 2 3 3 2 F 1 3 2 5 G 9 1 7 9 #!/bin/sh # [EMAIL PROTECTED] arquivo=num # NOME DO ARQUIVO tamanho_final=9# VALOR MAXIMO DENTRO DO ARQUIVO for ((tamanho_inicial = 1; tamanho_inicial $[tamanho_final + 1]; tamanho_inicial++)) do cat num |awk '/'$tamanho_inicial'.*'$tamanho_inicial'/' resultado done cat resultado |sort|uniq Que finalmente gera.. [EMAIL PROTECTED]:/home/rodrigo]$ sh s.sh A 3 3 4 5 C 4 4 5 6 D 4 5 6 4 E 2 3 3 2 G 9 1 7 9 Mas tem um problema aqui.. por exemplo.. se voce tiver valores maiores que 10 já nao vai dar para comparar, porque ele esta comparando caracter por caracter.. ou seja.. voce teria X 1 3 5 15 Ele acharia que eh igual porque ele irá procurar caracter a caracter e nao cadeia de caracteres.. Posta ai pra gente se vc tem numeros maiores que 9 que tentaremos achar uma outra solucao.. abs! 2008/7/4 Gunther Furtado [EMAIL PROTECTED]: Olá, O tópico recente que tratava do awk me deixou curioso para saber se ele resolverá um problema para mim, com a ajuda de vocês, é claro: A 3 3 4 5 B2 3 4 5 C 4 4 5 6 D 4 5 6 7 Dado um arquivo entradas que contenha a informação acima, eu gostaria de imprimira as linha que contenham qualquer valor repetido, nem só o 3, nem só o 4. O resultado que espero é: $ awk '/alguma mágica/ { print $0 }' entradas A 3 3 4 5 C 4 4 5 6 ao invés de: $ awk '/3.*3/ { print $0 }' entradas A 3 3 4 5 $ awk '/4.*4/ { print $0 }' entradas C 4 4 5 6 O arquivo real é um pouco maior (47x15), com uns 700 valores diferentes e preciso de uma maneira rápida de descobrir se há valores que se repetem em qualquer de suas linhas. Gracias, -- Gunther Furtado [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: [assunto paralelo] imprimir linhas que contenham valores repetidos
Opa.. cheguei agora aqui.. hehehe eh facinho brother.. vamos la.. Depende da faixa de valores que vc tem dentro do arquivo.. mas vou dar exemplo do que criei aqui.. [EMAIL PROTECTED]:/home/rodrigo]$ cat num A 3 3 4 5 B 2 3 4 5 C 4 4 5 6 D 4 5 6 4 E 2 3 3 2 F 1 3 2 5 G 9 1 7 9 #!/bin/sh # [EMAIL PROTECTED] arquivo=num # NOME DO ARQUIVO tamanho_final=9# VALOR MAXIMO DENTRO DO ARQUIVO for ((tamanho_inicial = 1; tamanho_inicial $[tamanho_final + 1]; tamanho_inicial++)) do cat num |awk '/'$tamanho_inicial'.*'$tamanho_inicial'/' resultado done cat resultado |sort|uniq Que finalmente gera.. [EMAIL PROTECTED]:/home/rodrigo]$ sh s.sh A 3 3 4 5 C 4 4 5 6 D 4 5 6 4 E 2 3 3 2 G 9 1 7 9 Mas tem um problema aqui.. por exemplo.. se voce tiver valores maiores que 10 já nao vai dar para comparar, porque ele esta comparando caracter por caracter.. ou seja.. voce teria X 1 3 5 15 Ele acharia que eh igual porque ele irá procurar caracter a caracter e nao cadeia de caracteres.. Posta ai pra gente se vc tem numeros maiores que 9 que tentaremos achar uma outra solucao.. Olá, Com número até 9 (uma linha só): $ egrep '(0.*0|1.*1|2.*2|3.*3|4.*4|5.*5|6.*6|7.*7|8.*8|9.*9)' arquivo.txt Seguindo a mesma idéia, com números maiores até 99, deve-se envolver os números até 9 por \n\, por exemplo até 15 (uma linha só): $ egrep '(\0\.*\0\|\1\.*\1\|\2\.*\2\|\3\.*\3\|\4\.*\4\|\5\.*\5\|\6\.*\6\|\7\.*\7\|\8\.*\8\|\9\.*\9\|10.*10|11.*11|12.*12|13.*13|14.*14|15.*15)' arquivo.txt Claro que fazer na mão dá trampo, então para gerar a seqüência com todos envolvidos, pode-se usar (uma linha só): for i in `seq 0 n`; do echo -n \$i\.*\$i\|; done; echo Agora pode-se ainda abstrair e não colocar apenas números, pode ser letras também no lugar dos números na expressão regular do egrep. Indo um pouco mais além, pode-se ainda criar um while read linha para pegar cada linha, decompor esta em colunas, pegar uma coluna e comparar com as demais, podendo a primeira coluna ser ignorada (uma linha só): cat arquivo.txt | while read linha; do coluna=($linha); [EMAIL PROTECTED]; for ((i=1; icolunas-1; i++)); do for ((j=i+1; jcolunas; j++)); do if ((coluna[i]==coluna[j])); then echo $linha; i=colunas; break; fi; done; done; done Porém aqui tem uma ressalva devido a caracteres reservados do bash que podem estar na linha, o que pode/vai causar erros. Isso também poderia ser feito usando a comparação por expr: cat arquivo.txt | while read linha; do echo -n $linha = ; for coluna in $linha; do if expr $linha : .*\$coluna\.*\$coluna\.* /dev/null; then echo -n $coluna = $linha; break; fi; done; echo; done Se ainda assim tiver problemas, relate melhor os problemas que proporemos uma ajuda para encontrar a melhor solução. PS: '\...\' é uma boa alternativa quando se trabalha com valores separados por caracteres não visíveis. []'s Junior Polegato -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]