我有一个包含 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[@]}