¿Cómo replace las comas con espacios en blanco en un csv, pero insertando un número de espacio diferente después de cada columna?

Tengo un file en el siguiente formatting:

s1,23,789 s2,25,689 

y me gustaría transformarlo en un file en el siguiente formatting:

 s1 23 789 s2 25 689 

es decir, ¿6 espacios en blanco entre la 1ra y la 2da columna y solo 3 espacios en blanco entre la 2da y la 3ra columna?

¿Hay una manera rápida de sacar esto usando sed o awk?

Algo en esta línea debería hacerlo:

 awk 'BEGIN{IFS=","} {printf("%s %s %s\n", $1, $2, $3)}' input_file 

Y de manera equivalente y más escueta (de los comentarios):

 awk -F ',' '{printf("%s %s %s\n", $1, $2, $3)}' input_file 

AWK

Awk alternativo con sprintf() :

 $ awk -F ',' '{long=sprintf("%6s"," ");short=sprintf("%3s"," "); print $1long$2short$3 }' input.txt s1 23 789 s2 25 689 

Y variación en el tema con printf() regular:

 $ awk -F ',' '{printf "%s%6s%s%3s%s\n",$1," ",$2," ",$3}' input.txt s1 23 789 s2 25 689 

Otra variación más sobre el tema de sprintf() , pero con funciones sub() y gsub() . Como sub() edita solo la primera coincidencia, es conveniente que la usemos para replace la primera coma con 6 espacios, y la otra con 3

 $ awk '{sub(/\,/,sprintf("%6s",""));gsub(/\,/,sprintf("%3s",""));};1' input.txt s1 23 789 s2 25 689 

Para las personas que les gustan las alternativas, aquí hay otros enfoques:

Perl

 $ perl -F',' -lane "print @F[0],' 'x6,@F[1],' 'x3,@F[2]" < input.txt s1 23 789 s2 25 689 

Pitón

 $ python -c 'import sys;lines=[l.strip().split(",") for l in sys.stdin];print "\n".join([ i[0]+" "*6+i[1]+" "*3+i[2] for i in lines])' < input.txt s1 23 789 s2 25 689 

SED

 $ sed -e 's/,/ /' -e 's/,/ /' input.txt s1 23 789 s2 25 689