[RESOLVIDO]empaquei no grep, cut, cat, tr...

Iniciado por raidicar, 18 de Março de 2009, 23:15

tópico anterior - próximo tópico

raidicar

Boa noite pessoal,

Estou desenvolvendo um script e, a principio, empaquei no que parecia ser a parte mais simples.
Em um determinado momento, um arquivo é gerado e esse arquivo tem em torno de 15 linhas.
No conteúdo desse arquivo, tenho uma palavra que será jogada dentro de uma variável.

Exemplo do arquivo gerado:
76169828  38554776  37615052
ddddddd dddddddd lll999005551% 909077
jjjjjjjkkkkkkkkkkeeeeeeeeeeeeeeee

ou seja, é um arquivo com letras e números.
Dentro desse arquivo tenho um unico caractere que não se repete, que é o símbolo "%"

Preciso jogar os dois números que vem antes desse símbolo e armazená-lo em um arquivo texto e em uma variavel.
Os números quase nunca serão os mesmos, eles dificilmente se repetem.
Até ai parecia moleza, pois com o cut e o tr eu poderia chegar ao resultado desejado, porém, a quantidade de caracteres muda a cada laço do script e o que eu preciso jogar em uma variável, a cada laço, estará em uma posição diferente do arquivo, por isso, não tenho como prever onde o símbolo "%" estará no arquivo, o que me impede de trabalhar com o cut.

Como eu tenho um único símbolo "%", acreditei que o grep poderia me mostrar, mas o comando complicou, estou procurando no help do comando mas não encontro uma equivalência que possa me ajudar, começo a tentar jogar a saída de um comando em outro, mas não obtenho o resultado desejado.
seria algo assim:
grep "**%" arquivo.txt >> arquivo2.txt[/b]
Obviamente esse comando não joga o símbolo "%" e os dois caracteres na frente desse símbolo dentro de um arquivo texto, mas é exatamente o que eu preciso.
O que eu preciso é de uma saída com o valor exato pesquisado, que seria o "%" mais os dois caracteres na frente desse símbolo.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

dudu_ubuntun

Bom, vamos ter q fazer 3 passos
1) saber qual a posição dos dois caracteres antes do %, minha sugestão:
cat arquivo.txt | grep % | cut -f1 -d"%" | wc -m

isso vai nos dar algo como "30", se vc pegar essas 3 linhas do exemplo e salvar num arquivo.txt vai ver que dá isso

2) saber qual é a posição 2 caracteres antes:
inicio=`expr $qtd_letras - 2`

isso vai dar (no nosso exemplo) 28

3)pegar os caracteres ;)

cat arquivo.txt | grep % | cut -f1 -d"%" |cut -c${inicio}-${qtd_letras}

isso vai retornar 51 no nosso exemplo ;)

juntando tudo numa linha so usando o && ficaria assim:

qtd_letras=`cat teste | grep % | cut -f1 -d"%" | wc -m` && inicio=`expr $qtd_letras - 2` && cat teste | grep % | cut -f1 -d"%" |cut -c${inicio}-${qtd_letras} >> arquivo2.txt


não acho que esteja elegante, ms espero que sirva de luz, se der certo avise ;)

Abs


danpos

@raidicar

A saída é usar uma expessão regular com sed e ou awk (ou talvez com o próprio bash). Dê uma olhada no site do Aurélio Jargas (lá tem um livro gratuito e inacabado de SED e material de expressão regular) ;)

Danpos.

raidicar

dudu_ubuntun
Grato pela resposta, acabei, na verdade, utilizando parte de sua resposta em outra parte do script para resolver um outro problema de lógica que, ao ler seu post, acabei descobrindo, então, seu post foi muito mais do que útil, foi fundamental, pois ele me fez ver um erro grave que tinha deixado passar despercebido e me causaria um grande problema futuro.
É engraçado quando as vezes obtemos respostas a um problema que desconhecíamos até então ;D.

danpos
Eu estava pesquisando expressões regulares, mas até eu postar aqui no tópico não havia encontrado uma solução ideal, na verdade, estava cada vez indo mais longe da solução, definindo variáveis aqui e acolá, jogando a saída de um comando em outro de forma interminável, utilizando grep, cat, wc, sed, cut, sort, awk e tudo o que tenho direito e, de repente, veio a raiva pois sabia que existiria uma solução simples e curta, comecei a achar um absurdo não ter um comando que simplesmente me de esse resultado, não acreditei que depois de anos de trabalho, havia empacado em algo  desse nível...
Ai, com a raiva, veio o "branco", me deu um branco, empaquei geral, nada mais dava certo, não conseguia prosseguir, digitava "echo" e saia "ecoh" e eu não via mais nem meus erros de digitação, então, parei e postei no fórum, afinal, ajuda é SEMPRE bem vinda.
A solução informada pelo dudu_ubuntun  eu não testei, adaptei para resolver um outro problema, mas acredito que funciona perfeitamente, apesar de um pouco longa, mas, as vezes, um problema simples requer uma solução um tanto complexa, fazer o que.
Vou dar uma olhada nesse site que me recomendou, tenho um livro muito bom também que fala quase tudo sobre o sed.
Eu não havia testado a solução do dudu_ubuntu pois testando expressões regulares e me aprofundando nas opções do grep, cheguei a uma solução para o problema, que foi o seguinte comando:
variavel=`grep -o '[0-99]**%' arquivo.txt`
Reconheço que a uma falha no comando, mas a principio, ele me deu o resultado desejado e com esse resultado, posso jogá-lo em um novo arquivo e com o comando cut obter o resultado desejado, mas, devido a sequência de caracteres, pude jogar direto o valor na variável, OBRIGADO pela ajuda nesse ponto.
Amanhã eu "refino" essa linha de comando.

Em outra parte do script, precisei fazer algo semelhante, porém, ao invés do símbolo "%" eu tinha o caracter "G" como referência e, precisava dos 3 números antes desse caracter, porém, ele se repetia por 3 vezes no arquivo, e sempre em posições diferentes, mas eu precisava pegar os 3 números na frente do terceiro caractere "G" dentro desse arquivo e joga-lo em uma variável, ou seja, um problema semelhante ao anterior, consegui utilizando a seguinte expressão:
variavel=`cat ARQUIVO | grep -o '[0-999]***G' | tr -d "G" | sed 3q | tail -1`
Não consegui simplificar mais do que isso, mas também obtive o resultado desejado.

Obrigado pela ajuda pessoal.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

dudu_ubuntun

que bom que vc conseguiu resolver teu prroblema, eu nao sou bom em shell script e reconheço q as minhas soluções não são elegantes, ms gosto de provar q é possivel, e com isso despertarnos outros  a vontadede querer superar e conseguir também ;)

sugestão: coloque um RESOLVIDO no tituulo do topico para as pessoas saberem q vc conseguiu uma solução ;)

Abs