Domanda

Ho un file di registro da cui devo estrarre modelli specifici.Devo trovarli e quindi elaborarli in un nuovo file.grep su Linux di solito farebbe il trucco, ma l'espressione regolare si estende su più righe, cosa che capisco che grep non faccia.

ecco un esempio dal mio file di registro/debug:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

Sto cercando /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ Voglio quindi inviare le righe in un nuovo file rimuovendo lambda e riorganizzare i numeri sulla stessa riga in modo da ottenere l'output \1\s\2\s\3\s\4\n

Quindi in realtà ho due domande:

  1. Esiste un'utilità semplice per eseguire questa operazione, su qualsiasi sistema?
  2. C'è un modo per farlo specificatamente su Windows?

Spero che ci sia una soluzione semplice a questo che mi è sfuggito.Preferirei restare su Windows, ma se dovessi passare a Linux lo farò.

È stato utile?

Soluzione 3

grazie per tutte le risposteMi piacciono le risposte che mi hai dato per Perl e Awk.Sono uno di quegli strani programmatori che non conoscono Perl, quindi ho preso la strada di Ruby.ecco la mia soluzione

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
}

questo posso usarlo come utility con il mio editor Notepad++ tramite NppExec, che non supporta reindirizzamento e piping, per quanto ne so.Ciò mi consente anche di raccogliere qualsiasi output di cui ho bisogno per diagnosticare in base al programma.Grazie ancora a tutti.

Altri suggerimenti

Questo è un buon candidato per awk, perl e simili analisi con stato (funzioneranno su entrambi i sistemi Windows CMD.EXE, a condizione che tu lo abbia perl e/o awk/sed nel tuo PATH, oltre che, ovviamente, su Linux e altri Unice):

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


Se necessario, puoi eseguire un secondo passaggio per normalizzare gli spazi bianchi (e tagliare gli spazi bianchi alla fine delle righe).

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

Potresti installare Perl o Python o Ruby o PHP e scrivere lo script abbastanza facilmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top