次の形式のファイルがあります。
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