2013-02-04 52 views
3

我有一个这样的文件:从时间删除秒(AWK,SED)

XX1, 1.1,24.08.1994 13:00:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30:00, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 

所以时间格式是不相符的。有些行有时间,如hh:mm:ss,有些行有时间格式hh:mm。我想删除秒,并得到一个文件是这样的:

XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 

我试过至今

#!/bin/bash 
sed '[email protected],\(..\):\(..\):\(..\) @,\1:\2 @' <time_fault> ./time_corrected 

#!/usr/bin/awk -f 
BEGIN { RS="," ; FS=":"; ORS=","} 
{ getline str 
gsub(/*..:..:..*/, $1":"$2 str) > time_corrected } 

但都没有奏效。

回答

2

随着需要sed只有一个捕获组:

sed -re 's/([0-9]{2}:[0-9]{2}):[0-9]{2},/\1,/' -e 's/, +/, /g' file 
XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 

也许awk更好..只适用于第三场替换如果需要其他删除多余的空格来自第四位:

$ awk '{if ($3~/([0-9]{2}:){2}/) sub(/:[0-9]{2},/,",",$3);else sub(/ */,"",$4)}1' 
XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 
2

检查了这一点,如果它是确定你:

根据你的榜样输入,这应该工作:

awk -F, 'split($0,a,":")>2{gsub(/:[0-9][0-9],/,",")}1' file 

测试

kent$ echo "XX1, 1.1,24.08.1994 13:00:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30:00, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133"|awk -F, 'split($0,a,":")>2{gsub(/:[0-9][0-9],/,",")}1' 
XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 
+0

这个作品!但我不明白如何......首先你将当前记录$ 0分割为一个带分隔符“:”的数组a。对于字段Nr。大于2时,用逗号替换两位数字和逗号?而最终的结果是什么? – telemachos

+1

如果nr> 2,表示该行有“秒”部分,gsub用于删除该部分。 1到底意味着,实际上是“真实的”,打印当前行,当然已经被gsub取代了。 – Kent

4

你几乎得到了它。

sed '[email protected]\(..\):\(..\):\(..\)@\1:\[email protected]' 

XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 
+0

正常工作,谢谢! – telemachos

2

我稍微调整了您的sed命令:

$ sed 's/ \(..:..\)[^,]*/ \1/g' file 
XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 
+0

工作正常,谢谢! – telemachos

1
awk -F, '{OFS=","}length($3)>16{$3=substr($3,0,16)}1' your_file 

如下测试:

> cat temp 
XX1, 1.1,24.08.1994 13:00:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30:00, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 

> awk -F, '{OFS=","}length($3)>17{$3=substr($3,0,16)}1' temp 
XX1, 1.1,24.08.1994 13:00, 111,112,113 
XX2, 1.2,24.08.1994 13:30, 121,122,123 
XX3, NaN,22.08.1995 15:00, 131,132,133 
2

方式一:

awk -F, '{$3=substr($3,0,16);}1' OFS=, file