如何在Bash中利用参考表重命名制表符分隔表的列值
用参考表批量替换制表符分隔表的第一列值
我有一张制表符分隔的数据表:
chr1 24809154 24809669 chr1 24546969 24547563 chr1 7932037 7932594 chr3 42012155 42012598 chr3 923035 923549 chr4 5799575 5799990 chr4 6895845 6896348 chr4 2337251 2337743 chr5 10715994 10716426 chr5 4385445 4385878
同时有一张参考映射表,用来替换第一列的内容:
chr1 scaffold_A chr2 scaffold_B chr3 scaffold_C chr4 scaffold_D chr5 scaffold_E
需要将第一张表的第一列按参考表替换,得到如下结果:
scaffold_A 24809154 24809669 scaffold_A 24546969 24547563 scaffold_A 7932037 7932594 scaffold_C 42012155 42012598 scaffold_C 923035 923549 scaffold_D 5799575 5799990 scaffold_D 6895845 6896348 scaffold_D 2337251 2337743 scaffold_E 10715994 10716426 scaffold_E 4385445 4385878
方法一:用awk命令(命令行首选)
awk可以直接读取参考表建立映射关系,再批量处理数据表,一行命令搞定:
awk 'NR==FNR {map[$1]=$2; next} {print map[$1] "\t" $2 "\t" $3}' reference.txt data.txt > output.txt
简单说明:
- 先读参考表,把
chrX和对应的scaffold_Y存入数组map - 接着读数据表,把第一列替换成
map里对应的值,再拼接原表的第二、第三列输出 - 结果会保存到
output.txt里,用\t保证输出还是制表符分隔
方法二:用sed命令(适合轻量替换)
先把参考表转成sed能识别的替换规则,再执行替换:
- 生成替换脚本:
sed 's/\(.*\)\t\(.*\)/s\/^\1\t\/\2\t\/g/' reference.txt > replace.sed
- 用脚本处理数据表:
sed -f replace.sed data.txt > output.txt
简单说明:
- 第一步把参考表的每一行转成
s/^chrX\t/scaffold_Y\t/g这种sed替换规则 - 第二步用生成的规则批量替换数据表中开头的
chrX内容
方法三:用Python脚本(适合自定义逻辑)
如果需要更灵活的处理(比如过滤空行、处理异常值),可以写个简单脚本:
# 读取参考表建立映射 mapping = {} with open('reference.txt', 'r') as ref_file: for line in ref_file: line = line.strip() if not line: continue chr_name, scaffold_name = line.split('\t') mapping[chr_name.strip()] = scaffold_name.strip() # 处理数据表并输出 with open('data.txt', 'r') as data_file, open('output.txt', 'w') as out_file: for line in data_file: line = line.strip() if not line: continue parts = line.split('\t') if parts[0] in mapping: parts[0] = mapping[parts[0]] out_file.write('\t'.join(parts) + '\n')
运行脚本:
python replace_chr.py
内容的提问来源于stack exchange,提问作者Geneious
相关产品推荐
相关产品推荐

