包含以下行的.csv文件:
20111205 010016287,1.236220,1.236440
需要这样读:
20111205 01:00:16.287,1.236220,1.236440
我如何在awk中执行此操作?试验,我到目前为止。我想我需要两次通过。一个sub用于读取日期和时间字段,另一个用于更改它。
awk -F, '{print;x=$1;sub(/.*=/,"",$1);}' data.csv
答案 0 :(得分:2)
使用awk
命令:
echo "20111205 010016287,1.236220,1.236440" | \
awk -F[\ \,] '{printf "%s %s:%s:%s.%s,%s,%s\n", \
$1,substr($2,1,2),substr($2,3,2),substr($2,5,2),substr($2,7,3),$3,$4}'
<强>解释强>
-F[\ \,]
:将分隔符设置为空格,
printf "%s %s:%s:%s.%s,%s,%s\n"
:格式化输出substr($2,0,3)
:削减所需作品中的第二个firls($2
)或者使用sed
命令:
echo "20111205 010016287,1.236220,1.236440" | \
sed 's/\([0-9]\{8\}\) \([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{3\}\)/\1 \2:\3:\4.\5/g'
<强>解释强>
[0-9]\{8\}
:首先匹配一个8位数的模式并将其另存为\1
[0-9]\{2\}...
:在空格匹配3位2位数字后,将其保存到\2
,\3
和\4
[0-9]\{3\}
:最后匹配3位数字格式并保存为\5
\1 \2:\3:\4.\5
:格式化输出答案 1 :(得分:0)
sed更适合这项工作,因为它是单行代码的简单替换:
$ sed -r 's/( ..)(..)(..)/\1:\2:\3./' file
20111205 01:00:16.287,1.236220,1.236440
但如果你喜欢这里的GNU awk和gensub():
$ awk '{print gensub(/( ..)(..)(..)/,"\\1:\\2:\\3.","")}' file
20111205 01:00:16.287,1.236220,1.236440