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

如何实现从A.txt随机选取不重复行写入B.txt?

解决从A.txt随机选取不重复行写入B.txt的问题

你的原代码仅能随机从A.txt选一行覆盖写入B.txt,但未处理重复选取的问题——它完全没有检查B.txt中已存在的内容。以下是实现需求的两种实用方案:

方案一:B.txt记录所有已选行(追加模式)

此方案中B.txt会保存所有已经选取过的行,每次运行脚本时,自动从A.txt中选一个从未出现过的行,追加到B.txt末尾:

# 获取A.txt中未在B.txt出现过的行作为候选池
candidates=$(grep -Fxv -f /home/B.txt /home/A.txt)

if [ -n "$candidates" ]; then
    # 从候选行中随机抽取一行
    selected=$(echo "$candidates" | shuf -n 1)
    # 将选中的行追加到B.txt,保留所有已选记录
    echo "$selected" >> /home/B.txt
else
    echo "A.txt中所有行都已被选取过,无新行可选"
fi

代码说明:

  • grep -Fxv -f /home/B.txt /home/A.txt:通过反向整行匹配筛选候选行。-F确保按固定字符串匹配,避免正则冲突;-x要求整行完全匹配;-v反向输出不匹配的内容。
  • shuf -n 1:从候选行中随机抽取一行。
  • >>:追加写入而非覆盖,让B.txt完整记录所有已选行,作为后续排除依据。

方案二:B.txt仅保留当前选中行(需历史记录文件)

如果需要B.txt每次只显示当前选中的一行,但确保不会重复选取之前选过的行,需要额外的历史记录文件追踪已选内容:

# 定义历史记录文件路径,用于保存所有已选过的行
history_file="/home/selected_history.txt"
# 确保历史文件存在,不存在则创建空文件
touch "$history_file"

# 筛选A.txt中未被选过的行
candidates=$(grep -Fxv -f "$history_file" /home/A.txt)

if [ -n "$candidates" ]; then
    selected=$(echo "$candidates" | shuf -n 1)
    # 覆盖写入B.txt,仅保留当前选中行
    echo "$selected" > /home/B.txt
    # 将选中行追加到历史记录,避免后续重复选取
    echo "$selected" >> "$history_file"
else
    echo "A.txt中所有行都已被选取过"
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:05:25