csv形式でsed

csv形式でsed

フォームのファイルがあります

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

0を含む7つの長さの行を生成するsedコマンドを作成したいと思います。

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/,$//'

おすすめ記事