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

求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

使用说明

  1. 将脚本保存为generate_data.sh,赋予执行权限:chmod +x generate_data.sh
  2. 修改NUM_NEW_ROWS变量设置要生成的行数
  3. 运行脚本:./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  # 标记为已存在,避免后续重复生成
    }
}

使用说明

  1. 将脚本保存为generate_data.awk
  2. 运行命令生成新文件:awk -f generate_data.awk sample.csv > new_sample.csv
  3. 若要直接追加到原文件:awk -f generate_data.awk sample.csv >> sample.csv

注意事项

  • 若需要更真实的名字,可替换名字池为外部名字列表(比如从系统字典中筛选合适的词汇)
  • 生成超大量数据时,可优化重复检查逻辑,比如提前生成所有可能的组合再随机选取,减少循环重试次数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:01:14