【问题标题】:sed/awk unix csv file modificationsed/awk unix csv文件修改
【发布时间】:2019-11-13 22:04:59
【问题描述】:

我有一个接收 .csv 文件的目录。

column1,column2,column3,columb4
value1,0021,value3,value4,
value1,00211,value3,value4,

我想删除标题,将第二列填充为 6 位数字并添加 ":",使其采用 HH:MM:SS 格式。例如

value1,00:00:21,value3,value4,
value1,00:02:11,value3,value4,

我可以使用 awk 将字符填充为 6 位数字,但我不确定在第二个 $2 中每 2 个字符插入半列。否则这可以在 sed 中完全完成吗?哪个性能更好?

谢谢

【问题讨论】:

  • 使用 GNU awk,请参阅 ideone.com/gP0RgX
  • 为什么00211000211 而不是002101

标签: shell unix awk sed


【解决方案1】:

你可以用 GNU awk 来做这一切:

awk 'BEGIN{FS=OFS=","} {$2=sprintf("%06d", $2); $2=substr($2,1,2) gensub(/.{2}/,":&","g",substr($2,3))}1' file

查看online demo

详情

  • BEGIN{FS=OFS=","} - 将输入/输出字段分隔符设置为逗号
  • $2=sprintf("%06d", $2) - 用零填充字段 2
  • $2=substr($2,1,2)""gensub(/.{2}/,":&","g",substr($2,3)) - 将字段 2 的值设置为字段的前两个字符 (substr($2,1,2)) 加上从第三个字符开始的字段子字符串,并在每两个字符块之前插入 :
  • 1 - 默认打印操作。

【讨论】:

    【解决方案2】:

    使用awk 格式化+替换魔术

    awk 'BEGIN{ FS = OFS = "," }
         NR > 1{ $2=sprintf("%06d", $2); gsub(/[0-9]{2}/, "&:", $2); 
                 $2=substr($2, 0, 8); print }' file
    

    输出:

    value1,00:00:21,value3,value4,
    value1,00:02:11,value3,value4,
    

    【讨论】:

    • 谢谢。如果我想将其扩展到例如如果 $3 != "Processed" 然后删除行。语法如何?
    【解决方案3】:

    sed

    $ sed -nE '2,$s/,([0-9]+)/,00000\1/;s/,0+(..)(..)(..),/,\1:\2:\3,/p' file
    
    value1,00:00:21,value3,value4,
    value1,00:02:11,value3,value4,
    

    我觉得可以简化一点。

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 2014-02-02
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多