我有以下长文件
2012-01-30 12:41:06,214 app10 device INFO [2012-01-30 12:40:46,214] info1 info2 info3 ...
这是来自远程离线设备,这意味着如果设备的时间(第二次)设置不正确,则指向未来。如果第 2 次指向未来,我想将其更改为第 1 次日期。如果这是相同的或过去的,我想保持原样。只有日期很重要,根本不需要时间。第二次之后,我们有几个数据,有时我们想要保留不同数量的列。
例:
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解决方案。感谢您的帮助
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 ...
好吧,
这可能对您有用,但它在第二个日期/时间之前增加了一个额外的空间,我把它留给你弄清楚如何删除它:
awk 'BEGIN { FS="[ \[]" }
{ if ( gensub("-","","g",$1) < gensub("-","","g",$7) ) { $7 = $1 }
$7 = "[" $7
print
}' INPUTFILE
你可以在这里看到它的实际效果@Ideone.com。
另一个 gnu awk 替代方案。如果不更改第二个日期,这将保持原始行不变:
awk -F '[][ t]+' '$6>$1 {$6=$1; $2=$7=""; gsub(OFS"+", OFS);} 1' file