Вывод cat в bash числовую переменную - PullRequest
1 голос
/ 17 ноября 2011

У меня есть набор файлов, каждый из которых содержит одно (целое) число, которое является количеством файлов в каталоге с тем же именем (без суффикса .txt) - результат wc для каждого изкаталоги.

Я хотел бы суммировать числа в файлах.Я пытался:

i=0; 
find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do i=$i+`cat $j.txt`; done
echo $i

Но ответ 0. Если я просто echo вывод cat:

i=0; find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do echo `cat $j.txt`; done

Значения есть:

1313
1528
13465
22258
7262
6162
...

Предположительно, мне нужно как-то разыграть вывод cat?

[EDIT]

В конце концов я нашел собственное решение:

i=0; 
for j in `find -mindepth 1 -maxdepth 1 -type d -printf '%f\n'`; do 
    expr $((i+=$(cat $j.txt))); 
done; 

28000
30250
...
...
647185
649607

но принятый ответ точнее, так как он не выводится по пути

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Способ суммирования вывода cat должен работать. Однако вы получаете 0, потому что ваш цикл while выполняется в подоболочке, и поэтому переменная, в которой хранится сумма, выходит из области видимости после окончания цикла. Подробнее см. BashFAQ / 024 .

Вот один из способов ее решения, используя подстановка процесса (вместо конвейера):

SUM=0
while read V; do
    let SUM="SUM+V" 
done < <(find -mindepth 1 -maxdepth 1 -type d -exec cat "{}.txt" \;)

Обратите внимание, что я позволил себе сменить операции find / cat / sum, но ваш подход также должен работать нормально.

1 голос
/ 18 ноября 2011

Мое однострочное решение без необходимости поиска:

echo $(( $(printf '%s\n' */ | tr -d / | xargs -I% cat "%.txt" | tr '\n' '+')0 ))
...