Como substituir vírgulas por espaços em branco em um csv, mas inserir um número diferente de espaço após cada coluna?

4

Eu tenho um arquivo no seguinte formato:

s1,23,789  
s2,25,689

e gostaria de transformá-lo em um arquivo no seguinte formato:

s1      23  789  
s2      25  689

ou seja, 6 espaços em branco entre a 1ª e a 2ª coluna e apenas 3 espaços em branco entre a 2ª e a 3ª coluna?

Existe uma maneira rápida de fazer isso usando sed ou awk?

    
por Alex Kinman 17.01.2017 / 02:22

2 respostas

6

Algo ao longo destas linhas deve fazê-lo:

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

E de forma equivalente e mais concisa (a partir dos comentários):

awk -F ',' '{printf("%s      %s   %s\n", $1, $2, $3)}' input_file
    
por 17.01.2017 / 02:27
4

AWK

Alternative awk com sprintf() :

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

E variação do tema com% regularprintf():

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

Ainda outra variação no tema de sprintf() , mas com funções sub() e gsub() . Como sub() edita apenas a primeira correspondência, é conveniente usá-la para substituir a primeira vírgula por 6 espaços e a outra por 3

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

Para as pessoas que gostam de alternativas, veja outras abordagens:

Perl

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

Python

$ 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
    
por 17.01.2017 / 05:40