You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求:用Shell脚本/Python处理CSV,去重、统计并排序

处理CSV文件:去重、添加计数列、按计数排序

需求说明

需要对CSV文件完成以下操作:

  • 移除第4列(num3)的重复项,保留每个num3对应的第一行
  • 在末尾新增count列,记录每个num3的重复次数
  • 按count列的数值降序排序,次数相同的保持原顺序

输入示例

id,num1,num2,num3
1,300,200,1121
2,300,190,1122
3,300,180,1123
4,300,170,1124
5,300,160,1125
6,300,150,1126
7,300,140,1127
8,300,130,1128
9,300,120,1129
10,300,195,1122
11,300,185,1122
12,300,175,1126
13,300,165,1122
14,300,155,1122
15,300,145,1122
16,300,135,1122

期望输出

id,num1,num2,num3,count
2,300,190,1122,7
6,300,150,1126,2
1,300,200,1121,1
3,300,180,1123,1
4,300,170,1124,1
5,300,160,1125,1
7,300,140,1127,1
8,300,130,1128,1
9,300,120,1129,1

方案1:Python实现

用Python内置的csv模块处理,逻辑清晰易维护:

import csv
from collections import Counter

# 统计num3的出现次数
num3_counts = Counter()
with open('input.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        num3_counts[row['num3']] += 1

# 提取唯一行并添加count列
unique_rows = []
seen_num3 = set()
with open('input.csv', 'r') as f:
    reader = csv.DictReader(f)
    new_fieldnames = reader.fieldnames + ['count']
    for row in reader:
        num3 = row['num3']
        if num3 not in seen_num3:
            seen_num3.add(num3)
            row['count'] = str(num3_counts[num3])
            unique_rows.append(row)

# 按count降序排序
unique_rows.sort(key=lambda x: int(x['count']), reverse=True)

# 写入结果文件
with open('output.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=new_fieldnames)
    writer.writeheader()
    writer.writerows(unique_rows)

说明

  • 先用Counter统计所有num3的出现频次
  • 遍历原文件时用集合记录已处理的num3,只保留第一次出现的行
  • 排序时将count转为整数,确保按数值大小降序排列
  • 最后通过DictWriter生成带新表头的结果文件

方案2:Shell脚本(awk实现)

适合Linux/macOS环境下快速处理,无需额外依赖:

#!/bin/bash

# 统计num3的出现次数,存入临时文件
awk -F ',' 'NR>1 {count[$4]++}' input.csv > counts.tmp

# 处理原文件:保留首次出现的num3,追加count列后排序
awk -F ',' '
    BEGIN {OFS=","}
    NR==1 {print $0, "count"; next}
    NR==FNR {count[$1]=$2; next}
    !seen[$4]++ {print $0, count[$4]}
' counts.tmp input.csv | sort -t ',' -k5,5nr > output.csv

# 清理临时文件
rm counts.tmp

说明

  • 第一行awk统计num3的次数,结果存到临时文件counts.tmp
  • 第二行awk分两次读取:先加载计数数据,再遍历原文件输出唯一行并追加count值
  • sort -t ',' -k5,5nr指定按第5列(count)数值降序排序
  • 最后删除临时文件,避免残留

内容的提问来源于stack exchange,提问作者xsukax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:18:29