Bash 使用gawk格式化日期字符串?
我遇到一个问题,运行此代码时:Bash 使用gawk格式化日期字符串?,bash,awk,gawk,Bash,Awk,Gawk,我遇到一个问题,运行此代码时: gawk 'BEGIN{FS=";";RS="\r\n"} { for (i = 1; i <= NF; i++) { if(match($i, /([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/, m)){ $i = m[1]"-"m
gawk 'BEGIN{FS=";";RS="\r\n"}
{
for (i = 1; i <= NF; i++) {
if(match($i, /([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/, m)){
$i = m[1]"-"m[2]"-"m[3]" " m[4]":"m[5]":"m[6]
printf $0 "\n"
}
}
}' contact20.txt > cleaned.txt
我得到:
3 0952 2001-03-22 11:56:13 2 2014-09-21-10.25.58.918626 J 2015-12-27-14.17.45.593190 N 0 0001-01-01-00.00.00.000000 N 2014-09-21-10.25.58.918626 2012-11-03-21.52.55.270989 N 0001-01-01-00.00.00.000000
但结果应该是这样的:
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00
我不明白为什么要删除
从字符串中删除,同时忽略日期字符串,如0001-01-01-00.00.00.000000
,并且匹配项仅与第一个匹配
我需要更改什么才能使work属性?您当前的方法将为循环中的每个字段输出/重复相同的行
要通过转换“日期”值的行获得所需结果,请使用以下命令:
awk 'BEGIN{ FS=OFS=";" }
{ for (i = 1; i <= NF; i++) {
if(match($i, /([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/, m)){
$i = m[1]"-"m[2]"-"m[3]" " m[4]":"m[5]":"m[6]
}
}
}1' contact20.txt > cleaned.txt
您不需要循环,只需要:
$ gawk '{print gensub(/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/,"\\1-\\2-\\3 \\4:\\5:\\6","g")}' file
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00
当然,使用sed也同样容易做到:
$ sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/\1-\2-\3 \4:\5:\6/g' file
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00
上面对gensub()使用GNU awk,对-E使用GNU或OSX sed。post所需的result@RomanPerekhrest更新了它。完全忘记了结果。。。谢谢:)将OFS的
更改为
@123是正确的,并且作为旁白-永远不要执行printf$0“\n”
或类似操作,而是执行print”%s\n“,$0
。想象一下,如果$0
包含printf格式字符,如%s
,会有什么不同。当然,该特定命令可以简化为仅打印print
。
$ gawk '{print gensub(/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/,"\\1-\\2-\\3 \\4:\\5:\\6","g")}' file
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00
$ sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/\1-\2-\3 \4:\5:\6/g' file
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00