csv에서 쉼표를 공백으로 바꾸지만 각 열 뒤에 다른 수의 공백을 삽입하는 방법은 무엇입니까?

csv에서 쉼표를 공백으로 바꾸지만 각 열 뒤에 다른 수의 공백을 삽입하는 방법은 무엇입니까?

다음 형식의 파일이 있습니다.

s1,23,789  
s2,25,689

다음 형식의 파일로 변환하고 싶습니다.

s1      23  789  
s2      25  689

즉, 첫 번째 열과 두 번째 열 사이에는 6개의 공백이 있고, 두 번째와 세 번째 열 사이에는 3개의 공백만 있습니까?

sed나 awk를 사용하여 이를 수행하는 빠른 방법이 있습니까?

답변1

다음과 같은 내용이 트릭을 수행해야 합니다.

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

다시 한 번 더 간결하게(댓글에서):

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

답변2

AWK

awk의 대안 sprintf():

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

그리고 주제에 대한 일반적인 변형은 다음과 같습니다 printf().

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

테마의 또 다른 변형 sprintf()이지만 기능이 포함되어 sub()있습니다 gsub(). 첫 번째 항목만 편집 되므로 sub()이를 사용하여 첫 번째 쉼표를 공백 6개로 바꾸고 다른 쉼표를 공백 3개로 바꾸는 데 편리하게 사용할 수 있습니다.

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

대안을 선호하는 사람들을 위해 다음과 같은 다른 방법이 있습니다.

진주

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

파이썬

$ 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

관련 정보