3

数字の列があり、1つずつ処理できるようにしたいと思っています。例:

3829 4837 3729 2874 3827 

合計、最大数、何でも取得できるようにしたいです。しかし、それを処理するために各番号を取得する方法がわかりません。私はREAAAAALLLLLLLLYを純粋なbashに固執したいと思います、私はbashの複雑な解決策を気にしません。しかし、awkが絶対に必要な場合は、それを使用します。sedは使いたくない。

私は次のようなことができると思います:

max= cut -d" " -f1
in line L cut -d" " -f$(loop index) 
#check for max

よくわかりません。

編集:あなたの答えに感謝します、私はbashで見たことがないいくつかの新しいものを見ました、そして私はそれらをもっと探求する準備ができています。探していた情報などを受け取りました。:)

4

3 に答える 3

3

文字列に数値のリストがある場合は、次のように処理するのが最も安全な方法です(グロブの拡張やその他の副作用を回避しながら)。

max=0
read -r -a number_array <<<"$numbers"
for number in "${number_array[@]}"; do
  if (( number > max )) ; then
    max=number
  fi
done    

ファイルから読み取る場合は、簡単な変更が適用されます(ファイルの読み取りに関するベストプラクティスについては、 http://mywiki.wooledge.org/BashFAQ/001を参照してください)。

max=0
while read -r -a numbers; do
  for number in "${numbers[@]}"; do
    if (( number > max )) ; then
      max=number
    fi
  done
done <input-file

区切り文字が別のものである場合は、IFSを適切に設定できます。たとえば、コンマで区切られている場合:

while IFS=, read -r -a numbers; do

ここで示したベストプラクティスは、値が実際に数値のみに制限されている場合はそれほど重要ではないことに注意してください。*ただし、入力データにが含まれていて、単に実行した場合

for number in $numbers; do

次に、*文字$numbers列内のは、現在のディレクトリ内のファイルのリストに置き換えられます。そうしないでください。

最後に、bashには浮動小数点演算のサポートが組み込まれていません。浮動小数点演算が必要な場合は、http://mywiki.wooledge.org/BashFAQ/022を参照してください

于 2013-03-21T19:14:41.603 に答える
3

シェルワード分割を利用して、プロセス番号を1つずつ処理する場合:

numbers="3829 4837 3729 2874 3827"
 for n in $numbers; do
     # do something with "$n"
done

SUM

numbers="3829 4837 3729 2874 3827"
echo $((${numbers// /+}))

また

numbers="3829 4837 3729 2874 3827"
for n in $numbers; do
     ((sum+=n))
done

echo $sum

LARGEST

numbers="3829 4837 3729 2874 3827"
for n in $numbers; do
     ((max<n)) && max=$n
done

echo $max

SUMまたは、いくつかのシェルトリックを備えたグローバルが必要な場合:

$ tr ' ' '+' <<< '3829 4837 3729 2874 3827' | bc                                 
19096 

また

$ awk '{$1=$1; print}' OFS=+ <<< '3829 4837 3729 2874 3827' | bc
19096

また

$ echo  '3829 4837 3729 2874 3827' |
    awk '{for (i=1; i<=NF; i++) c+=$i} {print c}'
19096
于 2013-03-21T19:04:04.080 に答える
2

単語の文字列を反復可能な構造に分割する方法は次のとおりです。

位置パラメータを使用する

numbers="3829 4837 3729 2874 3827"
set -- $numbers
sum=0
for n in "$@"; do
    # do something with $n
    (( sum += n ))
done
average=$(( sum / $# ))   # integer division only

実際の配列を使用する

numbers="3829 4837 3729 2874 3827"
nums=( $numbers )
sum=0
for n in "${nums[@]}"; do
    # do something with $n
    (( sum += n ))
done
average=$(( sum / ${#nums[@]} ))   # integer division only
于 2013-03-21T20:02:51.540 に答える