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

但是我想修改那个 bash 脚本来实际计算总 LOC,因为上面的输出是 1251。

谢谢您的帮助!

4

4 回答 4

2

这是另一种方法awk

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

解释:

  • grep -r LOC: *- 你的问题已经说明了它的作用
  • |将上一步中 grep 的结果通过管道传递到下一个命令
  • awk调用 awk 工具
  • {sum+=$NF}: 对于每一行,将最后一个字段添加到sum. NF代表 awk$NF中的字段数,具有该数字的字段的内容也是如此。
  • END{print sum}: 解析完所有行后,打印总和
于 2012-11-20T21:55:50.417 回答
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 回答
1

您应该能够使用 awk:

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

您可以通过设置 $IFS 来使用一个可爱的技巧:

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

假设 cygwin 有 GNU grep

于 2012-11-21T05:17:55.693 回答