Bashで内容を1行読む

Bashで内容を1行読む

内容はこの順序でスペースで区切られたファイルがあります。

  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

関連情報