如何使用 awk 计算多个文件中不以 # 开头的行并用文件名列出它们?

如何使用 awk 计算多个文件中不以 # 开头的行并用文件名列出它们?

我一直用来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 }
' {} +

相关内容