如何找到目录中的平均行数?

如何找到目录中的平均行数?

我有一个包含 78 个 .tsv 文件的目录。我想找出目录中所有文件的平均行数。

我用来tail -n +2 $i | wc -l; done > line_numbers.txt获取行数(不包括文件头)以输出到 txt 文件中。txt 文件输出将如下所示:

0
10
2
12
14
10
7
13
10
25
14
13
14
...

但我只想打印整个目录的行数平均值,而不是从 txt 文件输出计算平均值。

做这个的最好方式是什么?

答案1

这是一个简单的解决方案,但是如果很多文件的文件名中都有换行符,那么它将不起作用:

files=$(ls *.tsv | wc -l)
lines=$(cat *.tsv | wc -l)
average=$(( (lines-files)/files ))

一个更强大的解决方案,可以处理奇怪的文件名和大量文件:

names=(*.tsv)
files=${#names[@]}
lines=$(printf '%s\0' "${names[@]}" | xargs -0 cat | wc -l)
average=$(( (lines-files)/files ))

答案2

使用awk

awk 'END{FNUM=ARGC-1; print (NR-FNUM)/FNUM}' *.tsv

答案3

bc -l <<< $(tail -q -n+2 *.csv | wc -l)/$(ls *.csv | wc -l)
#            ~~ Data lines ~~~~   Count    ~ Files ~  Count

如果文件名包含换行符,则需要使用不同的策略来计数文件。用文件名填充数组,然后使用参数长度扩展来获取数组中的元素数量:

csv_files=(*.csv)
bc -l <<< $(tail -q -n+2 *.csv | wc -l)/${#csv_files[@]}

相关内容