Pegar um número após a string que utilizei no grep

1. Pegar um número após a string que utilizei no grep

Flávio Olimpio Sanches Neto
flavio_olimpo

(usa Outra)

Enviado em 10/09/2016 - 16:37h

Boa tarde pessoal,

Pessoal eu preciso pegar uma string especifica.

Exemplifico:

! R5 R(5,6) 0.9939 calculate D2E/DX2 analytically

eu preciso pegar o número "0.9939" ( esse valor é so para o 1° arquivo, eu tenho mais de 300 arquivos) só que nem sempre ele está na 4° coluna, mas sempre ele está a frente da seguinte string "R(5,6)"
devido a isso eu queria um comando que sempre pegasse o número que estivesse em seguida da string que citei anteriormente. eu uso o seguinte comando, porém fica arquivos em branco que esse valor não está na 4 coluna:

for y in 3-21g 6-31g 6-31ga 6-311++gaa 6-311+ga 6-31+ga 6311dfg 6-31+g 6-311+g 6-311g aug-cc-pvdz aug-cc-pvtz aug-cc-pvqz; do
cat "TS2_"umpw3pbe"_"$y".out" | grep "R(5,6)" | awk '{print $4}' | sed -e '1,3d' >> "TS2_"$y".txt"
done

Alguém pode me ajudar?

Grato



  


2. Re: Pegar um número após a string que utilizei no grep

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 10/09/2016 - 16:46h

Faça como te disseram na outra versão deste mesmo tópico que funciona para este também.


3. Re: Pegar um número após a string que utilizei no grep

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 23/09/2016 - 20:14h

echo "! R5 R(5,6) 0.9939 calculate D2E/DX2 analytically" | sed 's/^.*R(5,6)\s\?\([0-9.]\+\).*/\1/'
espero ter ajudado!


4. Re: Pegar um número após a string que utilizei no grep

Savio Nascimento
saviounix

(usa Debian)

Enviado em 15/10/2016 - 21:12h

flavio_olimpo escreveu:

Boa tarde pessoal,

Pessoal eu preciso pegar uma string especifica.

Exemplifico:

! R5 R(5,6) 0.9939 calculate D2E/DX2 analytically

eu preciso pegar o número "0.9939" ( esse valor é so para o 1° arquivo, eu tenho mais de 300 arquivos) só que nem sempre ele está na 4° coluna, mas sempre ele está a frente da seguinte string "R(5,6)"
devido a isso eu queria um comando que sempre pegasse o número que estivesse em seguida da string que citei anteriormente. eu uso o seguinte comando, porém fica arquivos em branco que esse valor não está na 4 coluna:

for y in 3-21g 6-31g 6-31ga 6-311++gaa 6-311+ga 6-31+ga 6311dfg 6-31+g 6-311+g 6-311g aug-cc-pvdz aug-cc-pvtz aug-cc-pvqz; do
cat "TS2_"umpw3pbe"_"$y".out" | grep "R(5,6)" | awk '{print $4}' | sed -e '1,3d' >> "TS2_"$y".txt"
done

Alguém pode me ajudar?

Grato


Boa Noite FLAVIO_OLIMPO,

Pelo que pude compreender da sua dúvida, é que deseja ler diversos arquivos ".out" e procurar neles uma palavra específica.
Atribuir cada ocorrência em um segundo arquivo com padrão "TS2_"<nomeoriginal>".txt".

Diante disso, criei um comando que talvez resolva seu problema da forma que pediu.
Porém, é necessário um certo ajuste no diretório para que tudo funcione como o esperado.
Todos os arquivos precisam estar no mesmo diretório da execução do comando a seguir:

Comando:
for i in `find ./*.out -type f -exec grep -l "R(5,6)" {} \; | awk -F".out" '{print(substr($1,3))}'`; do grep 'R(5,6)' $i".out" | sed 's/^.*R(5,6)\s\?\([0-9.]\+\).*/\1/' >> "TS2_"$i".txt"; done 



Explicando:
find ./*.out -type f -exec grep -l "R(5,6)" {} \; 

Retornará o nome de cada arquivo com o padrão "R(5,6)",precedido de "./"
Ex: "./Teste.out"

_______________________________________________________
awk -F".out" '{print(substr($1,3))}' 

Receberá o retorno do comando 'find+grep' e, utilizando o programa 'AWK', retornará apenas o nome do arquivo (sem o "./" e sem ".out")
Ex: "Teste"

_______________________________________________________
grep 'R(5,6)' $i".out" | sed 's/^.*R(5,6)\s\?\([0-9.]\+\).*/\1/' 

A cada arquivo lido pelo comando usado no programa 'for', será procurado e exibido apenas as linhas que contém o padrão "R(5,6)".
Cada umas destas linhas, retornadas pelo programa 'grep', serão filtradas pelo programa 'sed' em busca da string que sucede o padrão especificado.
Ex:
grep retornará ------> "! R5 R(5,6) 0.9939 calculate D2E/DX2 analytically"
sed filtrará o texto e retornará ------> "0.9939"

_______________________________________________________
>> "TS2_"$i".txt" 

Atribuirá as strings encontradas em um novo arquivo com extensão ".txt", usando o padrão de nomes descrito.
Ex: "TS2_Teste.txt"



Vale lembrar que o comando 'sed', descrito acima, foi criado anteriormente pelo nosso amigo ALANVICTORJP. Apenas aproveitei a solução proposta por ele e complementei para ir direto ao foco do seu problema.

Espero ter ajudado em algo,

Até mais ;D
Savio


5. Re: Pegar um número após a string que utilizei no grep

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/10/2016 - 01:23h

flavio_olimpo escreveu:

Boa tarde pessoal,

Pessoal eu preciso pegar uma string especifica.

Exemplifico:

! R5 R(5,6) 0.9939 calculate D2E/DX2 analytically

eu preciso pegar o número "0.9939" ( esse valor é so para o 1° arquivo, eu tenho mais de 300 arquivos) só que nem sempre ele está na 4° coluna, mas sempre ele está a frente da seguinte string "R(5,6)"
devido a isso eu queria um comando que sempre pegasse o número que estivesse em seguida da string que citei anteriormente. eu uso o seguinte comando, porém fica arquivos em branco que esse valor não está na 4 coluna:

for y in 3-21g 6-31g 6-31ga 6-311++gaa 6-311+ga 6-31+ga 6311dfg 6-31+g 6-311+g 6-311g aug-cc-pvdz aug-cc-pvtz aug-cc-pvqz; do
cat "TS2_"umpw3pbe"_"$y".out" | grep "R(5,6)" | awk '{print $4}' | sed -e '1,3d' >> "TS2_"$y".txt"
done

Alguém pode me ajudar?
Grato

Boa noite Flavio.
Coloque o "campo" pretendido, na 1º posição, direcione a saída para o awk . . .
echo "!     R5      R(5,6)                  0.9939         calculate D2E/DX2 analytically"|sed 's/! .*R(5,6) \+//'|awk '{print$1}' 

#SAíDA
0.9939


Att.:
marcelo oliver








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts