1

私は次の長いファイルを持っています

2012-01-30 12:41:06,214 app10 device INFO [2012-01-30 12:40:46,214] info1 info2 info3 ...

これはリモートオフラインデバイスからのものであり、デバイスの時間(2回目)の設定が正しくない場合は、将来を指していることを意味します。2回目が未来を指す場合は、1回目に変更したいと思います。これが同じか過去の場合は、そのままにしておきたいと思います。重要なのは日付だけで、時間はまったく必要ありません。2回目以降は、いくつかのデータがあり、場合によっては異なる数の列を保持したいと考えています。

例:

2012-01-30 12:41:06,214 app10 device INFO [2013-01-30 12:40:46,214] info1 info2 info3 ...

する必要があります

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ...

これをスクリプトから実行したいので、bash、sed、awk、またはperlソリューションを好みます。ご協力ありがとうございました

4

3 に答える 3

2
awk -F '[[:space:][]+' '
    $6 > $1 {$6 = $1} 
    {
        for (i=7; i<NF; i++) {$i = $(i+1)}; NF--   # delete time field 7
        for (i=2; i<NF; i++) {$i = $(i+1)}; NF--   # delete time field 2
        print
    } 
' <<< "2012-01-30 12:41:06,214 app10 device INFO [2222-33-44 12:40:46,214] info1 info2 info3 ..."

出力

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ...
于 2012-11-15T14:35:52.880 に答える
0

これはうまくいくかもしれませんが、2番目の日付/時刻の前に余分なスペースが追加されます。それを削除する方法はあなたに任せます:

awk 'BEGIN { FS="[ \\[]" } 
{ if ( gensub("-","","g",$1) < gensub("-","","g",$7) ) { $7 = $1 }
  $7 = "[" $7
  print
}' INPUTFILE

実際の動作は、@ Ideone.com で確認できます。

于 2012-11-15T09:41:58.723 に答える
0

別の gnu awk の代替。2番目の日付が変更されていない場合、これは元の行を変更しません:

awk -F '[][ \t]+' '$6>$1 {$6=$1; $2=$7=""; gsub(OFS"+", OFS);} 1' file
于 2012-11-20T15:56:19.403 に答える