2012-03-16 9 views
0

私はawkコマンドを探して、テキストファイルの時間列を最も近い5分間隔に変更します。したがって12:56:59は12:55:00になりますawkを使ってファイルを処理する

次のコマンドは期待どおり動作します。応答していただきありがとうございます。

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' | awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}' 

正しい結果:

​​

しかし、私は同様に日付以外のフィールドを表示したいです。以下は動作しません:

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' | awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}' 

間違った結果:

565 14718:00:00 

それがあるべき...

565 123 2012-03-10 12:55:00 country 
+0

[最も近い5分に丸める](http://stackoverflow.com/questions/9718047/round-down-to-nearest-5-minutes) – shellter

答えて

2

あなたはただ一つ、複数のawkコマンドを、必要とし、あなたはありません

$ cat foo.awk 
BEGIN { 
    # all fields are separated by^
    FS = "^"; 
} 
{ 
    # $7 is the date and time in the form yyyy-mm-dd hh:mm:ss. 
    # Split at colons to get hours minutes and seconds into a[1] 
    # through a[3]. Round minutes to nearest 5. 
    split($7, a, ":"); 
    a[2] = int(a[2]/5) * 5; 

    # print first and second field, then rounded time, then 8th field. 
    printf "%s %s %s:%02d:00 %s\n", $1, $2, a[1], a[2], $8; 
} 
$ cat input 
565^123^$3^$4^$5^$6^2012-03-10 12:56:59^country 
$ awk -f foo.awk < input 
565 123 2012-03-10 12:55:00 country 
$ 
:ファイルに入れることができますスクリプトではawkの FS(フィールドセパレータ)変数を設定することができます
+0

これはまさに私が探していたものです。もう1つのリクエスト...私はsedの/ \ /〜/ g 'を使ってすべてのスペースを特殊文字に置き換えます。それは同じawkプログラムでも可能ですか? – shantanuo

+0

はい、gsub()を使用して大域置換置換を行います。それは無視することができる置換の数を返します。例えば、最後のprintfの前に挿入された 'gsub(" "、"〜 ");は、すべてのフィールドのすべてのスペースを置き換えます。したがってcountry'は 'Berzerkistan'の人民共和国だった'場合、出力は '〜Berzerkistan'の565 123 2012年3月10日12時55分00秒人民共和国〜〜だろう。 – torek

+0

gsubは処理時間を10倍増加させました。だからそれを含めない。 – shantanuo

関連する問題