使用 gawk 格式化日期字符串?
Format date string using 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[2]"-"m[3]" " m[4]":"m[5]":"m[6]
printf [=10=] "\n"
}
}
}' contact20.txt > cleaned.txt
输入:
3;0952;2001-03-22-11.56.13.514119;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.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
之类的日期字符串并且匹配只匹配第一个?
我需要更改什么才能工作 属性?
您当前的方法将 output/repeat 循环中每个字段的同一行。
要获得所需的结果作为具有转换后的“date”值的行,请使用以下内容:
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
cat cleaned.txt
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
你不需要循环,你只需要:
$ 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})/-- ::/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。
我有一个问题,当 运行 此代码时:
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 [=10=] "\n"
}
}
}' contact20.txt > cleaned.txt
输入:
3;0952;2001-03-22-11.56.13.514119;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.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
之类的日期字符串并且匹配只匹配第一个?
我需要更改什么才能工作 属性?
您当前的方法将 output/repeat 循环中每个字段的同一行。
要获得所需的结果作为具有转换后的“date”值的行,请使用以下内容:
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
cat cleaned.txt
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
你不需要循环,你只需要:
$ 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})/-- ::/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。