基础文本统计 - 使用 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"
使用示例
-
准备数据文件
data.txt:
apple 10 red banana 20 yellow apple 15 red orange 8 orange banana 12 yellow apple 5 red -
运行脚本:
# 基本统计 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
这些脚本可以根据你的具体需求进行调整,支持各种分隔符、多级分组和聚合统计。