Pregunta

Tengo un archivo de registro que necesito para extraer patrones específicos de. Necesito encontrar y luego transformarlos en un nuevo archivo. grep en Linux por lo general hacer el truco, pero la expresión regular se extiende por varias líneas, que entiendo grep no hace.

Este es un ejemplo de mi archivo de registro / depuración:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

Busco /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ entonces quiero salida de las líneas a un nuevo archivo de la eliminación de la lambda y reordenar los números en la misma línea de salida por lo \1\s\2\s\3\s\4\n

Así que tengo en realidad dos preguntas:

  1. ¿Hay una utilidad fácil de lograr esto, en cualquier sistema?
  2. ¿Hay una manera de hacer esto específicamente en las ventanas?

Estoy esperando que hay una solución simple a este que me ha escapado. Yo preferiría permanecer en ventanas, pero si tengo que ir a Linux lo haré para hacer esto.

¿Fue útil?

Solución 3

Gracias por todas las respuestas. Me gustan las respuestas que me dio para el Perl y awk. Soy uno de esos programadores extraños que no saben Perl, así que tomé la ruta rubí. aquí está mi solución

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
}

esto puedo utilizar como una utilidad con mi editor Notepad ++ a través NppExec, que no soporta la redirección y tuberías, por lo que yo sé. Esto también permite que para mí para recoger cualquiera de la salida que necesito para diagnosticar por el programa. Gracias de nuevo todos ustedes.

Otros consejos

Este es un buen candidato para awk, perl y similares con estado de análisis (estos se ejecutará en tanto CMD.EXE de Ventanas, siempre que tenga perl y / o awk/sed en su PATH, así como, de por supuesto, en Linux y otros sistemas Unix):

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

o

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


Puede realizar una segunda pasada para normalizar los espacios en blanco (y recortar espacios en blanco al final de las líneas) si es necesario.

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

o

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

Se puede instalar Perl o Python o Ruby o PHP y escribir el guión con bastante facilidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top