1

我有以下长文件

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

这是来自远程离线设备,这意味着如果设备的时间(第二次)设置不正确,它指向未来。如果第二次指向未来,我想将其更改为第一次。如果这是相同的或过去的,我想保持原样。只有日期很重要,时间根本不需要。第二次之后,我们有几个数据,有时我们想保留不同数量的列。

例子:

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

好吧,这可能对您有用,但它会在第二个日期/时间之前添加一个额外的空间,我将其留给您弄清楚如何删除它:

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 替代方案。如果第二个日期没有改变,这个保持原来的行不变:

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