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