読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

shell の printf で "invalid numberne" と言われておこられた件について

問題

ファイルから 1 行ずつ読み込んで printf で表示するスクリプトで以下のようなエラーを得た.

#!/bin/bash

while read readline
do
  args=(${readline})
  printf "%10.8f%10.8f%10.8f" ${args[0]} ${args[1]} ${args[2]}
done < ${1:?}
: invalid numberne 12: printf: 0.12699

解決方法

どうやらスクリプトに問題があるのではなく読み込んだデータに問題があったらしい.より正確に言うと改行コードのせいで 0.12699 という数値列が数値として認識されていなかったらしい.一般的に linux で使われる改行コードは \n だけど, Windows では \r\n である.なので \r が残ったままだとうまく数値として認識されずこういったエラーが出るらしい.

$ cat -A hoge.dat
98.913^I 2.58553^I 0.12699^M$

この例でいうところの ^M が悪さをしていたわけであった.ということで trsed をつかってこれを削除してあげる.今回は sed を使ってみる.

sed 's/\r//' -i hoge.dat

あるいはスクリプトの内部で \r を削除するようにしてもいいかもしれない.

args=($(echo ${readline} | tr -d '\r'))