
内容はこの順序でスペースで区切られたファイルがあります。
4096 1230 4560 1024.... n
各番号をどのように読み、他のコマンドに渡すことができますか?つまり、各数字を1024で割ることです。
答え1
表示された場合強く打つ最も簡単な方法はread
配列に入れることです。
bash-4.1$ read -a l < file
その後、次の値を繰り返すことができます。
bash-4.1$ for n in "${l[@]}"; do echo "$n / 1024 ≈ $((n/1024)) = $(bc -l<<<"$n/1024")"; done
4096 / 1024 ≈ 4 = 4.00000000000000000000
1230 / 1024 ≈ 1 = 1.20117187500000000000
4560 / 1024 ≈ 4 = 4.45312500000000000000
1024 / 1024 ≈ 1 = 1.00000000000000000000
答え2
データがスペースで区切られている場合は、次のようにファイルの内容を配列にロードできます。
arr=$(< data.txt)
データを配列にロードした後、ループを使用して反復して1024に分割$arr
できます。for
$ for num in ${arr[*]}; do
res=$( expr $num / 1024 )
echo "$num / 1024 = $res"
done
はい
$ for num in ${arr[*]}; do res=$( expr $num / 1024 ); echo "$num / 1024 = $res";done
4096 / 1024 = 4
1230 / 1024 = 1
4560 / 1024 = 4
1024 / 1024 = 1
整数の代わりに浮動小数点結果を取得するには、bc
次の方法を使用します。
$ for num in ${arr[*]}; do
res=$(echo "scale=2; $num/1024" |bc)
echo "$num / 1024 = $res"
done
4096 / 1024 = 4.00
1230 / 1024 = 1.20
4560 / 1024 = 4.45
1024 / 1024 = 1.00
に渡される値を変更して、小数点以下の桁数を制御できますscale=
。環境`scale=5
:
4096 / 1024 = 4.00000
1230 / 1024 = 1.20117
4560 / 1024 = 4.45312
1024 / 1024 = 1.00000
引用する
答え3
シェルスクリプトの要点は、できるだけ少ない数のコマンドを実行することです。ここで、awk
通常、行をフィールドに分割し、算術演算を実行するのに最も適したコマンドは次のとおりです。
awk '{for (i = 1; i<= NF; i++) $i = $i/1024; print}' < your-file
シェルでシェルループを使用することは、一般的にシェルスクリプティング慣行が悪いという信号です。
答え4
大きなリストの場合、通常は一度に1つずつ行を抽出するカウンタを構築し、必要なすべての変数操作を確実に実行できます。cat foo.bar
デフラグされた大きな配列(; do行の場合)があります。ウィット:
InCt=`cat foo.bar|wc -l`
RunCt=1
while [ $InCt -ge $RunCt ]; do
LINE=`head -${RunCt} foo.bar|tail -1`
# do whatever you need with the line
let RunCt="$RunCt +1"
done