基于eggnog mapper输出制作KO注释表格的问题求助
处理EggNOG Mapper注释表格生成KO格式表格(解决引号与多值拆分问题)
核心问题拆解
你的需求是将EggNOG Mapper输出的注释表转换为标准KO关联表,需要解决两个关键点:
- 去除KO列中多余的引号
- 拆分KO列中逗号分隔的多值,实现一行基因对应一行KO的格式
分步解决方案
1. 先将XLSX转为干净的TSV(避免转TXT时自动加引号)
如果还在使用XLSX源文件,优先用命令行工具转成制表符分隔的TSV,避免手动转TXT时的引号问题:
libreoffice --headless --convert-to tsv:Text -o ./ test.xlsx
执行后会生成test.tsv,这是无冗余格式的纯文本表格。
2. 清理引号并拆分多值
如果已经有带引号的TXT文件,先通过sed批量去除所有双引号,再用awk拆分KO列:
步骤1:去除所有引号
sed 's/"//g' test.txt > cleaned_test.txt
步骤2:拆分KO多值生成目标表
假设你的表格中:
- 基因ID在第1列
- KO列在第5列(根据实际列数调整)
- 表格用制表符分隔(如果是逗号分隔,将
-F'\t'改为-F',')
执行以下awk命令:
awk -F'\t' 'NR>1 { # NR>1 跳过表头行,不需要则删除该条件 split($5, ko_list, ","); for (i in ko_list) { # 去除KO值前后的空格(比如"K00001, K00002"拆分后可能带空格) gsub(/^[[:space:]]+|[[:space:]]+$/, "", ko_list[i]); print $1 "\t" ko_list[i]; } }' cleaned_test.txt > ko_final_table.txt
为什么之前的awk会陷入死循环?
大概率是因为带引号的逗号被awk误判为字段分隔符,导致字段解析混乱。先通过sed去掉所有引号后,awk可以正确识别KO列中的逗号分隔符,避免循环逻辑出错。
效率说明
17000行数据量很小,sed和awk都是原生高效工具,整个处理过程几秒内就能完成。
内容的提问来源于stack exchange,提问作者btredcup
相关产品推荐
相关产品推荐

