Pergunta

Eu tenho um arquivo de log que eu preciso para extrair padrões específicos de. Eu preciso encontrar e, em seguida, processá-los em um novo arquivo. grep em Linux normalmente seria fazer o truque, mas os vãos de expressão regular várias linhas, que eu entendo grep não fazer.

aqui está um exemplo do meu arquivo de log / debug:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

Eu estou procurando /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ Eu, então, quer para a saída as linhas para um novo arquivo removendo o lambda e reorganizar os números na mesma linha para \1\s\2\s\3\s\4\n saída

Então, eu tenho na verdade, duas perguntas:

  1. Existe um utilitário fácil de fazer isso, em qualquer sistema?
  2. Existe uma maneira de fazer isso especificamente no windows?

Eu estou esperando há uma solução simples para isso que me escapou. Eu prefiro ficar em janelas, mas se eu tiver que ir para Linux eu vou para obter este feito.

Foi útil?

Solução 3

obrigado por todas as respostas. I como as respostas que me deram para o perl e awk. Eu sou um desses programadores estranhas que não conhece perl, por isso, tomei a rota rubi. aqui está a minha solução

x=ARGV[0]
f=File.new(ARGV[1])
g=File.new(ARGV[2],"w")
f.read.gsub(/#{x}:\s*(([\d\.\-]*\t*)+\n)+/ ){|entry|
    puts entry
    g.puts entry.gsub(/#{x}:\n/,'').gsub(/\s+/,"\t").strip
}

isso eu posso usar como um utilitário com o meu editor Notepad ++ através NppExec, que não faz redirecionamento suporte e tubulação, tanto quanto eu sei. Isso também permite que para mim para recolher quaisquer da saída que eu preciso para diagnosticar por programa. Obrigado mais uma vez vocês.

Outras dicas

Este é um bom candidato para awk, perl e similares stateful parsing (estes serão executados em CMD.EXE tanto do Windows, desde que tenha perl e / ou awk/sed em sua PATH, bem como, de naturalmente, em Linux e outros Unices):

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file

ou

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file >output_file


Você pode realizar uma segunda passagem para o espaço em branco normalize (e espaço em branco guarnição no final das linhas), se necessário.

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file | sed -e "s: *: :g" -e "s: *$::" >output_file

ou

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file | perl -ne "s/ +/ /g; s/ +$//g; print" >output_file

Você pode instalar Perl ou Python ou Ruby ou PHP e escrever o roteiro com bastante facilidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top