我一直用来grep "^[^#]" file.txt | wc -l
计算单个文件中的行数。
如何计算awk
不以以下内容开头的行数#
并打印出如下文件名?
file1.txt 30
file2.txt 33
....
答案1
您还可以通过以下方式执行此操作grep
:
grep -c "^[^#]" *
或者
grep -cv "^#" *
前者还排除空行;后者则不然。
请注意,如果当前目录中有单个文件,则不会显示文件名;您可以通过添加选项来避免某些版本grep
(包括 GNU )的这种情况:grep
-H
grep -cvH "^#" *
GNUgrep
还支持递归搜索以下降目录树:
grep -rcvH "^#" .
输出与您的要求不太相符,最终会像这样
file1.txt:30
file2.txt:33
但这可以通过通过管道输出来解决sed 's/:\([^:]*\)$/ \1/'
。
答案2
这是你可以做的awk
(同样^[^#]
适用grep
于 awk ,但在awk
正则表达式匹配中写在斜杠对内/.../
(也有其他方法)):
find . -type f -exec \
awk '/^[^#]/ {count++}; END{ print FILENAME, count+0 }' {} \;
或者如果你有一个 GNU awkENDFILE{}
堵塞:
gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' ./multiple.files*
或者递归地:
find . -type f -exec \
gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' {} +
笔记:
- 使用
/^[^#]/
将跳过空行计数。_ - 仅当输入中没有空行时,使用
!/^#/
才相当于有条件的,否则也会计算空行,这就是它的真正作用,并且在询问时更正确/^[^#]/
!/^#/
“计算不以#开头的行” !/^#/
与的完全相同/^([^#]|$)/
(因此两者也会计算空行)
考虑到上述几点,如果您也想计算空行,如“计算不以 # 开头的行”,请执行以下操作:
awk '!/^#/{count++} END{ print FILENAME, count+0 }'
或其同等:
awk '/^([^#]|$)/{count++} END{ print FILENAME, count+0 }'
或者(建议@埃德莫顿):
awk '/^#/{ count++ } END{ print FILENAME, FNR-count }'
并对 GNU awk 形式应用相同的方法:
awk '/^#/{ count++ } ENDFILE{ print FILENAME, FNR-count; count=0 }'
如果您想在文件充满注释行时跳过打印输出:
awk '/^#/{ count++ } END{ if(count) print FILENAME, FNR-count }'
答案3
for i in *
do
if [[ -f "$i" ]]
then
co=$(grep -vc "^#" "$i" )
echo "$i $co"
fi
done
答案4
和perl
find . -type f -exec perl -lnse '
/^#/ || $c++;
eof && (print($ARGV,$c),$c=0);
' -- -,=: {} +
使用 POSIXly awk
:
find . -type f -exec awk -v OFS=: '
FNR==1 && NR>1 {
print prev, knt+0
knt=0
}
substr($0,1,1) != "#"{knt++}
FILENAME != prev {prev=FILENAME}
END { print prev, knt+0 }
' {} +