sed / awk unix CSV文件修改

时间:2019-11-13 22:04:59

标签: shell unix awk sed

我有一个正在接收.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中完全完成此操作吗?哪个对性能更好?

谢谢

4 个答案:

答案 0 :(得分:2)

您可以使用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-默认打印操作。

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

答案 2 :(得分:1)

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,

我认为可以简化一点。

答案 3 :(得分:-1)

使用GNU sed:

sed -r '1d;s/,([^,]+),/,00000\1,/;s/,[^,]*(..)(..)(..),/,\1:\2:\3,/' file

输出:

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

我对演出一无所知。您可能必须尝试一下。