csvでカンマをスペースに置き換えますが、各列の後に異なる数のスペースを挿入する方法は?

csvでカンマをスペースに置き換えますが、各列の後に異なる数のスペースを挿入する方法は?

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

s1,23,789  
s2,25,689

次の形式のファイルに変換したいと思います。

s1      23  789  
s2      25  689

つまり、最初の列と2番目の列の間に6つのスペースがあり、2番目と3番目の列の間に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

$ 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

関連情報