如何实现从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
相关产品推荐
相关产品推荐

