我有几个文件的一列中包含日期时间,我正在尝试将时间从“%hh.%nn.%ss”更改为“%hh:%nn:%ss”。 困难在于 TIME 列的位置根据文件而变化 例子
1-File 1:
22;23243;1;2013-08-23-15.46.34;
2- File 2 :
0000054;0000001;00496999999;0000;2012-02-29-13.40.18;001
谢谢你
unix命令中的sed解决问题
困难在于 TIME 列的位置会根据情况而变化 在文件示例中
您需要启发式来确定给定的列是否包含TIME,考虑到您的示例输入,我将按照以下方式利用GNU
AWK
,让file.txt
内容为
22;23243;1;2013-08-23-15.46.34;
0000054;0000001;00496999999;0000;2012-02-29-13.40.18;001
然后
awk 'BEGIN{FS=OFS=";"}{for(i=1;i<=NF;i+=1){if($i~/\y[0-9][0-9][.][0-9][0-9][.][0-9][0-9]\y/){gsub(/[.]/,":",$i)}};print}' file.txt
提供输出
22;23243;1;2013-08-23-15:46:34;
0000054;0000001;00496999999;0000;2012-02-29-13:40:18;001
解释:我通知 GNU
AWK
字段分隔符 (FS
) 和输出字段分隔符 (OFS
) 都是分号,然后对于每一行,如果给定列包含看起来像这样的子字符串,我使用 for
循环遍历字段TIME 然后我将其中所有 .
替换为 :
。所述子字符串是整个单词 dd.dd.dd
,其中 d
是数字,.
是点,\y
是 单词边界,并防止对具有比 TIME 合法数字更多的数字的子字符串做出反应,例如130.00.00
,观察到.
在正则表达式中具有特殊含义,所以我使用[.]
,这意味着文字点。
(在 GNU Awk 5.1.0 中测试)