2012-03-26 3 views
1

だから、何百もの異なるログファイルからかなり退屈なデータ収集プロセスを自動化しようとしている。次のスクリプト:正規表現が一致するときと違うときにawkを調整して

awk '/Loop/ { printf $4, }' log*weak*"$factor"x

は時間

私も今に対処しようとしている場合を「$時間のループ時間」という行を検索し、印刷され、ときがありますランタイムエラーであり、ログは決して書き込まれませんでした。つまり、ログファイルはそこにありますが、そこにテキストはありません。問題は、上記のスクリプトがログをスキップするだけだということです。私はそれがスペース文字を出力したい(これのすべてから作成されているcsvをより簡単に整列させるため)。

/Loop /が一致すると$ 4(時間)が表示されますが、そうでないときは "、"が表示されます。

+0

あなたのファイルには 'Loop'にマッチする行は1行までですか? – Mat

+0

はい、プログラムは 'Loop'を1回だけ持つテンプレートを使います。それは何の問題も見つからず、その行から時間を出力することができます。 しかし、 'Loop'がなければ何も出力しません。何かをプリントアウトしたいので、CSVでそのテストを再実行する必要があることがわかります。 – user1209326

答えて

3

いいえfound変数必要があります:あなたのコメントを読んだ後

awk ' 
    /Loop/ { 
    print $4 
    } 

    END { 
    if (! $0) { 
     print " " 
    } 
    } 
' YOURINPUTS 

を、この単純なスニペットは、トリックを行う必要があります。

awk '{print ($4) ? $4 : " "}' FILE.CSV 

にですC.のような三項演算子

+0

あなたの答えをありがとう - 私は変数に頼る必要はありません。ちょっと分かりましたが、awkの方が少し良くなっていますが、 'END'キーワードでは何が指定されていますか?それが正規表現の終わりか、スクリプトの最後のブロックですか? – user1209326

+0

@ user1209326の場合、ENDブロックはコマンドライン上のすべてのファイルを処理した後に実行されます。少し不明瞭なのは、ファイルが空の場合に行番号がゼロであることを確認するために 'END {if(NR == 0)print" "}'です。 –

+0

@glennjackmanああ、私は理解しています。だから私は私の質問で十分に明確ではなかったと思う。私は自分のセルのたびにスプレッドシートを作っています。問題は、ログファイルが空の場合、スクリプトが空のセルを作成しておらず、後続のすべてのセルがその列と正しく整列していないことです。 ここで私が試してみようとしている動作は、ログファイルに数字がある場合は数字、それ以外の場合はスペースです。したがって、csvは '1.123、、2.134'のようになります。私はファイルが処理されている間に実行する何かを実装する必要があると思いますか? – user1209326

2

これについて何:

awk ' 
    FILENAME != oldf { oldf = FILENAME ; If (found != 0) { prínt " " } ; 
        found = 0 } 
    /Loop/ { 
    print $4, ; 
    found++ 
    } 

    END { 
    if (! found) { 
     print " " 
    } 
    } 
' YOURINPUTS 
+0

サイドスクロールしなくても読みやすくするために再フォーマットしました。そうでなければ、これはまさに私が考えていたものです。 – larsks

+0

わかりますように、私はあまりawkに精通していません。この行を使用している場合、例えば500個のログファイルに対して、毎回0に再初期化されますか?私はまだコンピュータ上でファイルを実行していませんが、 'Loop'の1つのインスタンスは、それ以降の' if(!found) '条件をすべて破棄しますか? – user1209326

+0

@ user1209326、awk変数はグローバルなので、 'found'は再初期化されません。 –

関連する問題