在我的所有源代码文件中,每个文件顶部都有一个信息“标题”,如下所示(例如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.
感谢您的帮助!
答案 0 :(得分: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}
:解析完所有行后,打印总和答案 1 :(得分:1)
您应该可以使用awk:
grep -r LOC: * | awk 'BEGIN{sum=0}{sum=sum+$4}END{print sum}'
答案 2 :(得分: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"
答案 3 :(得分:0)
你可以通过设置$ IFS:
来使用一个可爱的技巧total=$(set -- $(grep -hoP '(?<=LOC: )\d+' *); IFS=+; bc <<< "$*")
假设cygwin有GNU grep