次の形式のファイルがあります。
s1,23,789
s2,25,689
そして私はそれを次のフォーマットのファイルに変換したいと思います:
s1 23 789
s2 25 689
つまり、1列目と2列目の間に6つの空白があり、2列目と3列目の間に3つの空白だけがありますか?
Sedまたはawkを使用してこれを簡単に実行する方法はありますか?
これらの線に沿った何かがそれを行う必要があります:
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
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 -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 -e 's/,/ /' -e 's/,/ /' input.txt
s1 23 789
s2 25 689
_