我有一组文件,每个文件都包含一个(整数)数字,这是同名目录中的文件数(不带.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
的输出?
[编辑]
我最终找到了自己的解决方案:
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
但是接受的答案是整洁的,因为它不会沿途输出
答案 0 :(得分:4)
你总结cat
输出的方式应该有效。但是,您得到0
因为您的while
循环正在子shell中运行,因此一旦循环结束,存储总和的变量就会超出范围。有关详细信息,请参阅BashFAQ/024。
这是解决问题的一种方法,使用process substitution(而不是管道):
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 :(得分:1)
我的单线解决方案无需查找:
echo $(( $(printf '%s\n' */ | tr -d / | xargs -I% cat "%.txt" | tr '\n' '+')0 ))