1

ファイルのセットがあり、それぞれに単一の(整数)番号が含まれています。これは、同じ名前のディレクトリ内のファイルの数です(.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

しかし、答えは 0echoです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

しかし、受け入れられた答えは、途中で出力されないため、よりきれいです

4

2 に答える 2

4

出力を合計する方法は機能するcatはずです。ただし、ループがサブシェルで実行されている0ため、whileループが終了すると合計を格納する変数が範囲外になるため、取得しています。詳しくはBashFAQ/024をご覧ください。

(パイプの代わりに)プロセス置換を使用して、これを解決する1つの方法を次に示します。

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

私は自由に検索/猫/合計操作を変更しましたが、あなたのアプローチもうまくいくはずです。

于 2011-11-17T12:00:28.143 に答える
1

find を必要としない私のワンライナーソリューション:

echo $(( $(printf '%s\n' */ | tr -d / | xargs -I% cat "%.txt" | tr '\n' '+')0 ))
于 2011-11-18T01:19:47.850 に答える