Question

J'ai un fichier journal que j'ai besoin d'extraire des modèles spécifiques de. Je dois trouver, puis de les traiter dans un nouveau fichier. grep sur Linux serait généralement faire l'affaire, mais l'expression régulière s'étend sur plusieurs lignes, que je comprends grep ne le fait pas.

ici est un exemple de mon journal / fichier de débogage:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

Je cherche /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ Je veux alors sortir les lignes dans un nouveau fichier de retirer le lambda et réarranger les numéros sur la même ligne pour la sortie \1\s\2\s\3\s\4\n

J'ai en fait deux questions:

  1. Y at-il un utilitaire facile d'y arriver, sur tout système?
  2. Est-il possible de le faire spécifiquement sur les fenêtres?

J'espère qu'il ya une solution simple à ce qui m'a échappé. Je préfère rester dans les fenêtres, mais si je dois aller à Linux, nous pour y parvenir.

Était-ce utile?

La solution 3

Merci pour toutes les réponses. J'aime les réponses que vous avez données pour me perl et awk. Je suis l'un de ces programmeurs étranges qui ne connaissent pas perl, donc je pris la route rubis. voici ma solution

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
}

ce que je peux utiliser comme un utilitaire avec mon éditeur Notepad ++ par NppExec, qui ne supporte pas et redirect la tuyauterie, pour autant que je sache. Cela permet aussi de me collectionne tout de la sortie que je dois diagnostiquer par le programme. Merci encore vous tous.

Autres conseils

Ceci est un bon candidat pour awk, perl et comme stateful d'analyse syntaxique (ceux-ci se déroulera dans les deux CMD.EXE de Windows à condition que vous avez perl et / ou awk/sed dans votre PATH, ainsi que, de Bien sûr, sur Linux et autres Unix):

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


Vous pouvez effectuer un second passage pour normaliser les espaces (et suppression des espaces à la fin des lignes) en cas de besoin.

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

Vous pouvez installer Perl ou Python ou Ruby ou PHP et écrire assez facilement le script.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top