Суммирование и подсчет в цикле for

Убедитесь сами, что встроенная функция wait не будет ждать случайного процесса - только дочерние элементы текущей оболочки.

#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done

$ ./t.sh
sleeping 3 seconds...
waiting for 93208...     ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done
1
06.02.2019, 13:47
2 ответа

Вы также можете сделать это с помощью awk, избегая необходимости for headдля каждого файла:

gawk '{count += 1; sum += $1; nextfile} 
      END {printf "count: %d\t sum: %d\n", count, sum}' *

Первое правило увеличивает количество и сумму, а затем переходит к следующему файлу, таким образом игнорируя все, кроме первой строки каждого файла. В ENDмы распечатываем числа.

nextfile— это вещь GNU, она может не работать в других версиях awk. Другой альтернативой может быть явная работа только с первой строкой :

.
awk 'FNR == 1 {count += 1; sum += $1} 
      END {printf "count: %d\t sum: %d\n", count, sum}' *

Это, однако, будет читать файлы полностью, даже если ничего не делать с остальными строками.

2
27.01.2020, 23:15

Думаю, то, что вы пытаетесь сделать, может быть достигнуто:

#!/bin/bash
sum=0
count=0
for file in "$@"
do
        number=$(head -1 "$file")
        count=$((count + 1))
        sum=$((sum + number))
done
echo "The sum of the $count file(s) is: $sum"

Вы просто добавляете переменные для хранения sumи countфайлов, с которыми работаете. Затем вы увеличиваете countкаждый раз, когда выполняете цикл. Также мы добавляем numberв начале строки файла к нашей переменной sum-.

5
27.01.2020, 23:15

Теги

Похожие вопросы