2

すべてのソースコードファイルで、各ファイルの上部に次のような情報の「ヘッダー」があります(Javaの例)。

/* Project: UVa Online Judge
 * Filetype: Java Source Code File
 * Filename: generic.java
 * Path: compsci/sandbox/uva_online_judge
 * Filesize: 1275 bytes
 * Date Created: 11/17/2011
 * Last Modified: Tue Nov 20, 2012  02:28PM
 * LOC: 33
 */

BASHコマンドラインから(Cygwinバージョン1.7.16でGNU bashバージョン4.1.10を使用しています)特定のプロジェクトフォルダー内のすべてのソースファイルの合計LOC(コード行)を計算しようとしています。トップレベルのプロジェクトフォルダー(私のソースコードの一部はこのフォルダーのサブフォルダーにあります)に移動し、次のコマンドを実行します。

$ grep -r LOC: *

それは私に次のことを与えます:

generic.c: * LOC: 44
generic.java: * LOC: 33
solved/100/uva_100.java: * LOC: 77
solved/102/uva_102.java: * LOC: 139
solved/108/uva_108.c: * LOC: 94
solved/120/uva_120.java: * LOC: 109
solved/200/uva_200.java: * LOC: 83
solved/414/uva_414.c: * LOC: 61
solved/424/uva_424.c: * LOC: 100
solved/700/uva_700.c: * LOC: 108
solved/900/uva_900.java: * LOC: 54
unsolved/341/uva_341.java: * LOC: 349

しかし、上記の出力が1251になるとすると、実際に合計LOCを計算するようにそのbashスクリプトを変更したいと思います。

助けてくれてありがとう!

4

4 に答える 4

2

でそれを行う別の方法は次のawkとおりです。

grep -r LOC: * | awk '{sum+=$NF} END{print sum}'

説明:

  • grep -r LOC: *-あなたの質問は、これが何をするかをすでに示しています
  • |前のステップの grep からの結果を次のコマンドにパイプします
  • awkawk ツールを呼び出す
  • {sum+=$NF}: 各行について、最後のフィールドを に追加しsumます。NFawk の Number of Fields を表すので、$NFその番号のフィールドの内容です。
  • END{print sum}: すべての行が解析された後、合計を出力します
于 2012-11-20T21:55:50.417 に答える
1

awk を使用できるはずです。

grep -r LOC: * | awk 'BEGIN{sum=0}{sum=sum+$4}END{print sum}'
于 2012-11-20T21:49:46.030 に答える
1

これをやってみてください:

bc <<< $(tr ' ' '+' <<< $(grep -r '^ *\* *LOC:' | cut -d ' ' -f4))

またはこれ

c=0
grep -r '^ *\* *LOC:' | cut -d ' ' -f4 | while read a; do
    ((c+=$a))
done

echo "$c lines"
于 2012-11-20T21:49:54.440 に答える
0

$IFS を設定することで、かわいいトリックを使用できます。

total=$(set -- $(grep -hoP '(?<=LOC: )\d+' *); IFS=+; bc <<< "$*")

cygwin に GNU grep があると仮定します

于 2012-11-21T05:17:55.693 に答える