awk转置文本文件的行

时间:2014-11-18 19:46:06

标签: awk

包含以下行的.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

2 个答案:

答案 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