Unix环境下识别重复记录并分配随机ID及求和value字段求助
解决Unix下CSV重复记录处理的方案
我来帮你搞定这个需求!要实现按id识别重复记录、添加唯一随机数并对value求和,用awk就能轻松完成——这可是Unix环境下处理这类文本任务的利器。
核心思路
我们分两步处理更稳妥:
- 先遍历文件,统计每个
id对应的value总和,同时为每个id生成一个唯一的随机数(如果需要每条记录单独的随机数也能调整)。 - 再遍历所有记录,把随机数和对应
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
相关产品推荐
相关产品推荐

