如何使用shell计算多个文件的平均列数
多文件平均列数统计Shell实现方案
基础版(默认空格/制表符分隔列,取每个文件第一行的列数统计)
直接执行以下命令即可,默认统计当前目录下所有文件的平均列数,可自行修改末尾的文件匹配规则(比如把*换成*.txt只统计txt文件)
awk 'FNR == 1 { sum += NF file_count += 1 } END { printf "总文件数:%d,总列数和:%d,平均列数:%.2f\n", file_count, sum, sum/file_count }' *
命令说明
FNR == 1:限定只处理每个文件的第一行,单个文件只统计一次列数NF:awk内置变量,代表当前行的列数- 脚本自动累加所有文件的列数、统计总文件数,最后直接计算平均
- 示例场景下执行会输出平均列数为4,和需求一致
自定义分隔符版本(如CSV逗号分隔文件)
只需加上-F参数指定分隔符即可,如下统计csv文件的平均列数:
awk -F ',' 'FNR == 1 { sum += NF file_count += 1 } END { printf "总文件数:%d,总列数和:%d,平均列数:%.2f\n", file_count, sum, sum/file_count }' *.csv
行列数不统一的兼容版本
如果单个文件内不同行的列数不一致,需要先计算单个文件内所有行的平均列数,再算所有文件的整体平均,使用以下命令:
awk '{ # 按文件名累加每个文件的总列数、总行数 file_col_sum[FILENAME] += NF file_line_count[FILENAME] += 1 } END { total_avg = 0 file_count = 0 for (filename in file_col_sum) { # 先算单个文件的平均列数 total_avg += file_col_sum[filename]/file_line_count[filename] file_count += 1 } printf "总文件数:%d,平均列数:%.2f\n", file_count, total_avg/file_count }' *
内容的提问来源于stack exchange,提问作者Salva
相关产品推荐
相关产品推荐

