web-dev-qa-db-ja.com

csvでコンマを空白に置き換えるが、各列の後に異なる数のスペースを挿入するにはどうすればよいですか?

次の形式のファイルがあります。

s1,23,789  
s2,25,689

そして私はそれを次のフォーマットのファイルに変換したいと思います:

s1      23  789  
s2      25  689

つまり、1列目と2列目の間に6つの空白があり、2列目と3列目の間に3つの空白だけがありますか?

Sedまたはawkを使用してこれを簡単に実行する方法はありますか?

4
Alex Kinman

これらの線に沿った何かがそれを行う必要があります:

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
6
Stephen Rauch

AWK

sprintf()を使用した代替awk:

_$ 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つのスペースに置き換え、もう1つのコンマを3に置き換えると便利です。

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

代替案が好きな人のために、他のアプローチがあります:

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
_
4