脚本如何实现文件内容分组统计

wen 实用脚本 1

基础文本统计 - 使用 awk

# 统计文件每行第一个字段的出现次数
awk '{count[$1]++} END {for (word in count) print word, count[word]}' filename.txt
# 按第二列分组,统计第三列的总和
awk '{sum[$2] += $3; count[$2]++} END {for (key in sum) print key, sum[key], count[key]}' data.txt

使用 sort + uniq 组合

# 按第一列分组统计
awk '{print $1}' filename.txt | sort | uniq -c | sort -rn
# 按分隔符分组(例如逗号分隔的CSV)
cut -d',' -f2 data.csv | sort | uniq -c

Python 脚本实现

#!/usr/bin/env python3
# 文件名:group_stats.py
import sys
from collections import Counter, defaultdict
def basic_group_count(filename, column=0):
    """基础分组计数"""
    counter = Counter()
    with open(filename, 'r') as f:
        for line in f:
            if line.strip():
                fields = line.split()
                if len(fields) > column:
                    counter[fields[column]] += 1
    # 按计数降序输出
    for key, count in counter.most_common():
        print(f"{key}: {count}")
def sum_by_group(filename, group_col=0, value_col=1):
    """分组求和"""
    groups = defaultdict(float)
    with open(filename, 'r') as f:
        for line in f:
            if line.strip():
                fields = line.split()
                if len(fields) > max(group_col, value_col):
                    key = fields[group_col]
                    value = float(fields[value_col])
                    groups[key] += value
    for key, total in sorted(groups.items(), key=lambda x: x[1], reverse=True):
        print(f"{key}: {total:.2f}")
def multi_field_stats(filename):
    """多字段分组统计"""
    from collections import defaultdict
    data = defaultdict(lambda: {'count': 0, 'sum': 0, 'values': []})
    with open(filename, 'r') as f:
        for line in f:
            if line.strip():
                fields = line.strip().split(',')
                if len(fields) >= 3:
                    group_key = f"{fields[0]}-{fields[1]}"
                    data[group_key]['count'] += 1
                    try:
                        data[group_key]['sum'] += float(fields[2])
                        data[group_key]['values'].append(float(fields[2]))
                    except ValueError:
                        pass
    # 输出统计结果
    print("分组统计结果:")
    print(f"{'分组':<15} {'数量':<8} {'总和':<10} {'平均值':<10}")
    print("-" * 45)
    for key, stats in sorted(data.items()):
        avg = stats['sum'] / stats['count'] if stats['count'] > 0 else 0
        print(f"{key:<15} {stats['count']:<8} {stats['sum']:<10.2f} {avg:<10.2f}")
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法: python group_stats.py <文件名>")
        print("示例: python group_stats.py data.txt")
        sys.exit(1)
    filename = sys.argv[1]
    # 基本分组计数(按第一列)
    print("=== 基本分组计数 ===")
    basic_group_count(filename)
    # 分组求和(按第一列分组,第二列求和)
    print("\n=== 分组求和 ===")
    sum_by_group(filename, 0, 1)

高级统计脚本

#!/usr/bin/env python3
# 文件名:advanced_stats.py
import pandas as pd
import sys
def csv_group_stats(filename):
    """使用pandas进行CSV文件分组统计"""
    try:
        df = pd.read_csv(filename)
        print("文件字段:", list(df.columns))
        # 按第一列分组统计
        group_col = df.columns[0]
        value_col = df.columns[1]
        print(f"\n按'{group_col}'分组统计'{value_col}':")
        stats = df.groupby(group_col)[value_col].agg([
            'count', 'sum', 'mean', 'std', 'min', 'max'
        ]).round(2)
        print(stats)
        # 按多列分组
        if len(df.columns) >= 3:
            print(f"\n按'{group_col}'和'{df.columns[1]}'分组统计:")
            multi_stats = df.groupby([group_col, df.columns[1]])[df.columns[-1]].agg([
                'count', 'sum', 'mean'
            ]).round(2)
            print(multi_stats)
    except Exception as e:
        print(f"错误: {e}")
def main():
    if len(sys.argv) < 2:
        print("用法: python advanced_stats.py <文件名>")
        print("支持CSV格式文件")
        sys.exit(1)
    # 检查是否为CSV文件
    if sys.argv[1].endswith('.csv'):
        csv_group_stats(sys.argv[1])
    else:
        # 普通文本文件
        with open(sys.argv[1], 'r') as f:
            lines = f.readlines()
        # 自动检测分隔符
        first_line = lines[0].strip() if lines else ""
        if ',' in first_line:
            sep = ','
        elif '\t' in first_line:
            sep = '\t'
        else:
            sep = None
        print(f"检测到分隔符: {repr(sep)}")
        # 处理数据
        data = []
        for line in lines:
            if line.strip():
                if sep:
                    data.append(line.strip().split(sep))
                else:
                    data.append(line.strip().split())
        if data:
            df = pd.DataFrame(data)
            csv_group_stats(pd.DataFrame.to_csv(df, index=False))
if __name__ == "__main__":
    main()

快捷命令行脚本

#!/bin/bash
# 文件名:group_count.sh
file="${1:-data.txt}"
col="${2:-1}"  # 默认第一列
echo "正在分析文件: $file"
echo "分组列: 第 $col 列"
echo ""
# 方法1:使用 awk
echo "=== awk 分组统计 ==="
awk -v col=$col '{count[$col]++} END {for (key in count) printf "%s\t%d\n", key, count[key]}' "$file" | sort -k2 -rn
echo ""
echo "=== 方法2:sort + uniq ==="
awk -v col=$col '{print $col}' "$file" | sort | uniq -c | sort -rn | awk '{printf "%s\t%d\n", $2, $1}'
# 可选:添加统计数据
echo ""
echo "=== 汇总信息 ==="
awk -v col=$col '{count[$col]++} END {total=0; for (key in count) total+=count[key]; print "总记录数:", total, "分组数:", length(count)}' "$file"

使用示例

  1. 准备数据文件 data.txt

    脚本如何实现文件内容分组统计

    apple 10 red
    banana 20 yellow
    apple 15 red
    orange 8 orange
    banana 12 yellow
    apple 5 red
  2. 运行脚本

    # 基本统计
    python group_stats.py data.txt

或者使用命令行

bash group_count.sh data.txt 1


3. **输出示例**:

=== 基本分组计数 === apple: 3 banana: 2 orange: 1

=== 分组求和 === apple: 30 banana: 32 orange: 8


这些脚本可以根据你的具体需求进行调整,支持各种分隔符、多级分组和聚合统计。

抱歉,评论功能暂时关闭!