我有一个以下形式的文件
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/,$//'