【问题标题】:awk to transpose lines of a text fileawk 转置文本文件的行
【发布时间】:2014-11-19 14:42:04
【问题描述】:

具有如下行的 .csv 文件:

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

【问题讨论】:

  • 为什么要替换的 RE 中有等号 (=)?您的输入文件是否包含等号?如果是这样,请更新您发布的示例输入以显示这一点。

标签: awk


【解决方案1】:

使用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):将第二个小花 ($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: 格式化输出

【讨论】:

  • 一个小修正。在 awk 解决方案中应该是 ($2, 0,2)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多