基于唯一映射对文本文件ID重新编号(Bash实现需求)
解决大文件ID映射问题:Bash高效实现方案
嘿,针对你这个200万行、两列ID的大文件需求,用Bash搭配awk、sort这些工具就能高效搞定,完全符合“重复ID用同一新编号、从1开始分配”的要求,还能轻松扛住百万级数据量。
核心思路
先把所有唯一ID提取出来,给它们分配从1开始的编号生成映射表,再用这个映射表批量替换原文件里的ID。全程用管道流处理,不用把整个大文件塞进内存,性能拉满。
步骤1:生成ID-新编号映射表
先从原文件的两列里提取所有ID,去重后给每个唯一ID分配编号:
# 替换成你的输入文件名,比如data.txt awk '{print $1; print $2}' your_input.txt | sort -u | awk '{print $0, NR}' > id_map.txt
拆解一下这串命令:
awk '{print $1; print $2}':把原文件两列的ID都拆成单独行,确保所有ID都被收集到sort -u:对所有ID排序并去重,得到10万个左右的唯一ID- 第二个
awk:用内置变量NR(当前行号)作为新编号,输出格式是「原ID 新编号」,保存成映射表id_map.txt
步骤2:批量替换原文件ID
用awk加载映射表,一次性替换原文件的两列ID:
awk 'NR==FNR {map[$1]=$2; next} {print map[$1], map[$2]}' id_map.txt your_input.txt > output.txt
解释下逻辑:
NR==FNR:当处理第一个文件(id_map.txt)时,把每个ID和对应的新编号存入map数组next:跳过后续处理,继续读下一行映射表内容- 处理原文件时,直接把每列的ID替换成
map里对应的新编号,输出到output.txt
性能优势
这个方案专门针对大文件优化:
sort -u是系统级的高效排序工具,处理百万级数据速度极快awk逐行处理,内存只需要存10万个ID的映射表,占用极小- 全程管道流,不需要临时存储中间大文件,磁盘IO也很高效
示例验证
用你给出的示例数据测试:
假设输入文件test.txt内容是:
1342342345345 34523453452343 0209239498238 29349203492342 2349234023443 99203900992344 2349234023443 182834349348 2923000444 9902342349234
生成的id_map.txt会是:
0209239498238 1 1342342345345 2 182834349348 3 2349234023443 4 2923000444 5 29349203492342 6 34523453452343 7 9902342349234 8 99203900992344 9
最终输出的output.txt为:
2 7 1 6 4 9 4 3 5 8
完全符合重复ID复用同一编号的要求。
注意事项
- 如果你的ID包含前导零(比如示例里的
0209239498238),sort -u默认按字符串排序,前导零会保留,不用担心丢失 - 如果原文件有空白行,可以在第一步命令里加
| grep -v "^$"过滤掉,避免映射表出现无效条目
内容的提问来源于stack exchange,提问作者paketecuento
相关产品推荐
相关产品推荐

