sed 转成 csv 格式

sed 转成 csv 格式

我有一个以下形式的文件

VL-8299673,30.000,49.000,1.000,21.901,2630.000,428861.000
VL-8299673,1071.000,570.000,35.000,3963.608,632.000,366563.000
VL-8299673,36.000,867.000,24.000,6523.005,3544.000,176054.000
VL-8299673,5:281185.000
VL-8299673,44.000,372.000,67.000,7029.358,293.000,446448.000
VL-8299673,5:48479.000
VL-8299673,0:2.000,2:7.000,3:80.222,4:1153.000

它应该是这样的形式

VL-8299673,1190.000,609.000,28.000,12676.158,1819.000,452813.000

但是当文件中有零时,它只显示非零的列号,例如

VL-8299673,0:2.000,2:7.000,3:80.222,4:1153.000

我想编写一个 sed 命令来生成包含零的 7 长度行,例如

VL-8299673,2.000,0,7.000,80.222,1153.000,0

有任何想法吗?

答案1

虽然可以用 来完成sed,但用 ;-) 会更清晰perl

perl -lpe '$n=0;s{,(\d+:)?([^,]*)}{if($1ne""){$r=",0"x($1-$n).",$2";
           $n=$1}else{$r=$&};$n++;$r}ge;$_.=",0"x(6-$n)'

一个可能的sed解决方案(没有经过太多测试):

sed 's/$/%543210@@@@@@@/;:1
  s/^\(\(@*\)[^,]*\),\([0-9]\):\(.*%.*\3.\{6\}\2\(.*\)\)/\5\1\5\4/;t1
  s/^\([^:]*\),/@\1@/;t1
  s/@*\(.*\)%.*/\1@@@@@@@/;s/\(\(@[^@]*\)\{7\}\).*/\1/
  :2
  s/@@/,0@/;t2
  y/@/,/;s/,$//'

相关内容