求Unix Shell脚本:基于样本文件生成无重复同类数据
生成无重复CSV样本数据的Unix Shell方案
假设你的样本数据文件名为sample.csv,以下是两种可直接使用的Shell/awk方案,生成格式一致且无重复的数据:
方案一:Shell脚本(依赖shuf工具)
#!/bin/bash # 原样本文件路径 SAMPLE_FILE="sample.csv" # 要生成的新数据行数 NUM_NEW_ROWS=10 # 获取原文件最大ID,确保新ID递增不重复 MAX_ID=$(tail -n +2 "$SAMPLE_FILE" | cut -d',' -f1 | sort -n | tail -1) # 提取去重的名字、姓氏池 FIRST_NAMES=$(tail -n +2 "$SAMPLE_FILE" | cut -d',' -f2 | sort -u) LAST_NAMES=$(tail -n +2 "$SAMPLE_FILE" | cut -d',' -f3 | sort -u) # 生成新数据并追加到原文件 for ((i=1; i<=NUM_NEW_ROWS; i++)); do FN=$(echo "$FIRST_NAMES" | shuf -n1) LN=$(echo "$LAST_NAMES" | shuf -n1) GENDER=$(echo -e "M\nF" | shuf -n1) NEW_ID=$((MAX_ID + i)) NEW_ROW="$NEW_ID,$FN,$LN,$GENDER" # 检查是否与原数据重复,避免生成重复行 if ! grep -q "^$NEW_ROW$" "$SAMPLE_FILE"; then echo "$NEW_ROW" >> "$SAMPLE_FILE" else i=$((i-1)) # 重复则重新生成当前行 fi done
使用说明
- 将脚本保存为
generate_data.sh,赋予执行权限:chmod +x generate_data.sh - 修改
NUM_NEW_ROWS变量设置要生成的行数 - 运行脚本:
./generate_data.sh
方案二:Awk单脚本(无需额外工具)
BEGIN { FS = "," OFS = "," num_rows = 10 # 要生成的新数据行数 srand() # 初始化随机数种子 } # 保留表头 NR == 1 { print next } # 收集原数据信息:去重的名字、姓氏,已存在的行,最大ID NR > 1 { if (!fn[$2]++) first_names[++fn_count] = $2 if (!ln[$3]++) last_names[++ln_count] = $3 existing[$0] = 1 if ($1 > max_id) max_id = $1 } # 生成新数据 END { for (i=1; i<=num_rows; i++) { # 循环生成直到得到不重复的行 do { fn_idx = int(rand() * fn_count) + 1 ln_idx = int(rand() * ln_count) + 1 gender = (rand() > 0.5) ? "M" : "F" new_id = max_id + i new_row = new_id OFS first_names[fn_idx] OFS last_names[ln_idx] OFS gender } while (existing[new_row]) print new_row existing[new_row] = 1 # 标记为已存在,避免后续重复生成 } }
使用说明
- 将脚本保存为
generate_data.awk - 运行命令生成新文件:
awk -f generate_data.awk sample.csv > new_sample.csv - 若要直接追加到原文件:
awk -f generate_data.awk sample.csv >> sample.csv
注意事项
- 若需要更真实的名字,可替换名字池为外部名字列表(比如从系统字典中筛选合适的词汇)
- 生成超大量数据时,可优化重复检查逻辑,比如提前生成所有可能的组合再随机选取,减少循环重试次数
内容的提问来源于stack exchange,提问作者Abhinandan
相关产品推荐
相关产品推荐

