0

特定のパターンを抽出する必要があるログ ファイルがあります。それらを見つけて、新しいファイルに処理する必要があります。通常、Linux では grep でうまくいきますが、正規表現は複数の行にまたがっています。

これは私のログ/デバッグ ファイルの例です。


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

私が探しているのは/Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ 、行を新しいファイルに出力してラムダを削除し、数値を同じ行に再配置して出力することです\1\s\2\s\3\s\4\n

だから私は実際に2つの質問があります:

  1. どのシステムでも、これを達成するための簡単なユーティリティはありますか?
  2. 特にWindowsでこれを行う方法はありますか?

私を逃れたこれに対する簡単な解決策があることを願っています。私はむしろ Windows にとどまりたいと思っていますが、Linux に行かなければならない場合は、これをやり遂げます。

4

3 に答える 3

1

awkこれは、perlなどのステートフル解析の良い候補です(これらは、Windows のおよび/またはの両方で実行CMD.EXEされます。もちろん、Linux やその他のユニックスでも実行されます)。perlawk/sedPATH

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

また

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


必要に応じて、2 番目のパスを実行して、空白を正規化 (および行末の空白を削除) できます。

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

また

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

于 2009-02-21T04:19:25.370 に答える
0

すべての答えに感謝します。perlとawkについてあなたがくれた答えが好きです。私は perl を知らない奇妙なプログラマーの 1 人なので、Ruby の道を選びました。ここに私の解決策があります

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
}

これは、NppExec を介してエディタの Notepad++ でユーティリティとして使用できますが、これは私の知る限り、リダイレクトとパイピングをサポートしていません。これにより、プログラムで診断する必要がある出力を収集することもできます。ありがとうございました。

于 2009-03-02T16:52:38.697 に答える
0

Perl、Python、Ruby、または PHP をインストールして、スクリプトをかなり簡単に作成できます。

于 2009-02-21T04:07:45.460 に答える