我有以下长文件
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解决方案。 谢谢你的帮助
答案 0 :(得分: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 ...
答案 1 :(得分:0)
这可能对你有用,但它会在第二个日期/时间之前增加一个额外的空间,我会把它留给你找出如何删除它:
awk 'BEGIN { FS="[ \\[]" }
{ if ( gensub("-","","g",$1) < gensub("-","","g",$7) ) { $7 = $1 }
$7 = "[" $7
print
}' INPUTFILE
答案 2 :(得分:0)
另一个gnu awk替代方案。如果第二个日期没有改变,这个原始行保持不变:
awk -F '[][ \t]+' '$6>$1 {$6=$1; $2=$7=""; gsub(OFS"+", OFS);} 1' file