awk转换文本文件的行
具有以下行的.csv文件:awk转换文本文件的行,awk,Awk,具有以下行的.csv文件: 20111205 010016287,1.236220,1.236440 20111205 01:00:16.287,1.236220,1.236440 它需要这样读: 20111205 010016287,1.236220,1.236440 20111205 01:00:16.287,1.236220,1.236440 在awk里我该怎么做?在实验中,我走了这么远。我想我需要两次传球。一个子项用于读取日期和时间字段,下一个子项用于更改它 awk -F, '{
20111205 010016287,1.236220,1.236440
20111205 01:00:16.287,1.236220,1.236440
它需要这样读:
20111205 010016287,1.236220,1.236440
20111205 01:00:16.287,1.236220,1.236440
在awk里我该怎么做?在实验中,我走了这么远。我想我需要两次传球。一个子项用于读取日期和时间字段,下一个子项用于更改它
awk -F, '{print;x=$1;sub(/.*=/,"",$1);}' data.csv
使用
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}'
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'
说明:
:将分隔符设置为空格和-F[\\,]
,
:格式化输出printf“%s%s:%s:%s.%s,%s,%s\n”
:将第二个firls(substr($2,0,3)
)切成所需的片段$2
sed
命令:
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}'
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'
说明:
:首先匹配8位模式并将其另存为[0-9]\{8\}
\1
:将一个2位模式的空格匹配3次后,将其保存到[0-9]\{2\}…
、\2
和\3
\4
:最后匹配3位模式并将其保存为[0-9]\{3\}
\5
:格式化输出\1\2:\3:\4\5
$ sed -r 's/( ..)(..)(..)/\1:\2:\3./' file
20111205 01:00:16.287,1.236220,1.236440
但如果你喜欢这是GNU awk和gensub()
为什么要替换的RE中有等号(
=
)?您的输入文件是否包含等号?如果是这样,请更新您发布的样本输入,以显示这一点。一个小的更正。在awk解决方案中,它应该是($2,0,2)