Posted at

awkで文字列を整数にして出力したい

More than 1 year has passed since last update.


やりたいこと


  • タブ等で区切られたテキストファイルの特定の列の値を整数にして出力したい


    • 例:「1,000(桁区切りのコンマつき)」や「1000.0(小数点のドットつき)」を「1000」として出力したい

    • 前提条件として、指定した列には意味的に整数値しか入らず列の挿入欠失によるズレは考慮しなくて良いものとする



  • awkでさくっとできるだろうと試したが、うまくいかなかった


テスト環境


  • Linux Mint 18.1

  • GNU Awk 4.1.3


やったこと


テストデータ


  • 3列×3行のタブ区切りファイルを作成

  • 1行目はヘッダー、2・3行目はデータ行

  • 1列目は文字列、2・3列目は整数にしたい


    • しかし3行目の2・3列目の値が整数になっていない



$ cat test1.txt

str num1 num2
FOO 1000 2000
BAR 1,000.0 2,000


  • awkでprintすると

$ awk -F"¥t" '{print $1,$2,$3}' test1.txt

str num1 num2
FOO 1000 2000
BAR 1,000.0 2,000


  • そのまま表示される


整数として出力するために試したこと


計算してから出力


  • 数値として扱ってあげることで数値としての自覚が芽生えるのではないか

  • 0を足したり1を掛けたりしてからprintしてみる

$ awk -F"¥t" '{print $1,$2+0,$3*1}' test1.txt

str num1 num2 0 0
FOO 1000 2000 0 0
BAR 1,000.0 2,000 0 0


  • だめでした

  • しかもなんか末尾に0が増えた

  • 状況は悪い方へ向かっています


intで型変換


  • いいかお前は整数なんだ!

  • intで囲む

$ awk -F"¥t" '{print $1,int($2),int($3)}' test1.txt

str num1 num2 0 0
FOO 1000 2000 0 0
BAR 1,000.0 2,000 0 0


  • だめでした


printf


  • printfならきっとなんとかしてくれる

$ awk -F"¥t" '{printf "%s %d %d¥n", $1, $2, $3}' test1.txt

str num1 num2 0 0
FOO 1000 2000 0 0
BAR 1,000.0 2,000 0 0


  • これもだめでした


まとめ


  • なぜできないのか。何か根本的に間違えているのか


  • 末尾に0がつくのはどうしてなのか


  • もらったファイルがアナーキーなのはわれわれの業界ではよくあることなのでこういうちょっとしたことにも対応できるようにしたい