awk转换文本文件的行

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, '{

具有以下行的.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, '{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”
    :格式化输出
  • substr($2,0,3)
    :将第二个firls(
    $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'
说明:

  • [0-9]\{8\}
    :首先匹配8位模式并将其另存为
    \1
  • [0-9]\{2\}…
    :将一个2位模式的空格匹配3次后,将其保存到
    \2
    \3
    \4
  • [0-9]\{3\}
    :最后匹配3位模式并将其保存为
    \5
  • \1\2:\3:\4\5
    :格式化输出

sed更适合这项工作,因为它是一种简单的单线替换:

$ sed -r 's/( ..)(..)(..)/\1:\2:\3./' file
20111205 01:00:16.287,1.236220,1.236440
但如果你喜欢这是GNU awk和gensub()


为什么要替换的RE中有等号(
=
)?您的输入文件是否包含等号?如果是这样,请更新您发布的样本输入,以显示这一点。一个小的更正。在awk解决方案中,它应该是($2,0,2)