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

Unix环境下识别重复记录并分配随机ID及求和value字段求助

解决Unix下CSV重复记录处理的方案

我来帮你搞定这个需求!要实现按id识别重复记录、添加唯一随机数并对value求和,用awk就能轻松完成——这可是Unix环境下处理这类文本任务的利器。

核心思路

我们分两步处理更稳妥:

  1. 先遍历文件,统计每个id对应的value总和,同时为每个id生成一个唯一的随机数(如果需要每条记录单独的随机数也能调整)。
  2. 再遍历所有记录,把随机数和对应id的总value追加到每条记录后面。

具体命令(同一id共用一个随机数)

假设你的输入文件是data.csv,执行以下命令会生成包含新字段的result.csv:

awk -F ',' '
BEGIN {
    FS = ",";
    OFS = ",";
    srand(); # 初始化随机数生成器,确保每次运行生成不同的随机数
    # 输出新表头,包含新增的两列
    print "name,location,id,state,website,status,color,field1,value,field3,field4,field5,unique_random,total_value"
}
NR == 1 { next } # 跳过原文件的表头行
{
    id = $3;          # 提取第3列的id
    value = $9;       # 提取第9列的value(对应你给的表头)
    # 如果是第一次遇到这个id,初始化总和和随机数
    if (!(id in sum)) {
        sum[id] = 0;
        # 生成12位随机整数,重复概率极低
        rand_num[id] = int(rand() * 1000000000000);
    }
    sum[id] += value; # 累加当前id的value
    records[NR] = $0; # 保存当前记录
    ids[NR] = id;     # 保存当前记录的id
}
END {
    # 遍历所有记录,追加随机数和总value后输出
    for (i = 2; i <= NR; i++) {
        print records[i], rand_num[ids[i]], sum[ids[i]];
    }
}
' data.csv > result.csv

如果你需要每条重复记录的随机数都唯一

只要把随机数的生成逻辑调整为每条记录单独生成,修改后的命令如下:

awk -F ',' '
BEGIN {
    FS = ",";
    OFS = ",";
    srand();
    print "name,location,id,state,website,status,color,field1,value,field3,field4,field5,unique_random,total_value"
}
NR == 1 { next }
{
    id = $3;
    value = $9;
    if (!(id in sum)) {
        sum[id] = 0;
    }
    sum[id] += value;
    # 为每条记录生成唯一随机数
    rand_num[NR] = int(rand() * 1000000000000);
    records[NR] = $0;
    ids[NR] = id;
}
END {
    for (i = 2; i <= NR; i++) {
        print records[i], rand_num[i], sum[ids[i]];
    }
}
' data.csv > result.csv

注意事项

  • 字段位置:确保value是第9列(对应你给出的表头),如果实际文件中字段位置不同,把$9改成对应的列号即可。
  • 随机数唯一性:如果需要绝对唯一的随机数,可以结合记录号(NR)生成,比如rand_num[id] = NR * 1000000 + int(rand()*1000000),这样每个id的随机数肯定不会重复。
  • 带引号的CSV:如果你的CSV字段包含逗号(比如website是"google,inc"),上面的基础awk命令会出错。这种情况可以安装csvkit工具(用apt install csvkit或brew install csvkit),然后用csvawk代替awk,它会自动处理带引号的字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:52