制表符分隔文件处理:根据alt列值替换ref列字符生成新列
TSV文件按ref/alt列规则生成衍生列
需求
处理包含ref、alt两列的制表符分隔文件,按规则生成3列衍生列,替换触发判断逻辑:
alt列为空时,不执行替换alt存在长度大于1的片段(例如TTGA)时,不执行替换- 仅当
alt为单个单字符、或逗号分隔的多个单字符时,执行对应替换
输入样例
ref alt T C C T A,C G TTGA C
输出规则
输出共5列,前2列和原文件完全一致,后3列生成规则:
- 所有场景下第3列固定为
ref列的原始值 - 不触发替换时,第4、5列均填充
ref原始值 - 若
alt为单个单字符:第4列为ref值替换为对应alt后的结果,第5列填充ref原始值 - 若
alt为逗号分隔的2个单字符:第4列为ref替换为第一个alt的结果,第5列为ref替换为第二个alt的结果
按规则生成的预期输出如下:
ref alt T C T C T C C C C T A,C T A C G TTGA G G G C C C C
注:纯文本环境下制表符显示宽度差异可能导致列对齐错位,执行逻辑以上述规则描述为准
实现方案
直接用awk处理即可,无需安装额外依赖,代码如下:
BEGIN { FS = OFS = "\t" } NR == 1 { # 表头补全3列占位,和输出总列数对齐 print $0, "", "", "" next } { ref = $1 alt = $2 # 初始化新增列默认值为ref,适配不替换场景 col3 = col4 = col5 = ref valid = 1 if (alt != "") { n = split(alt, arr, ",") # 校验所有alt片段是否为单字符 for (i=1; i<=n; i++) { if (length(arr[i]) != 1) { valid = 0 break } } # 校验通过则生成替换后的值 if (valid && n <= 2) { col4 = gensub(ref, arr[1], 1, ref) if (n == 2) col5 = gensub(ref, arr[2], 1, ref) } } print $0, col3, col4, col5 }
使用方式
将代码保存为process_tsv.awk,执行以下命令即可直接生成结果文件:
awk -f process_tsv.awk 输入文件路径.tsv > 输出文件路径.tsv
内容的提问来源于stack exchange,提问作者Sunil Pachakar
相关产品推荐
相关产品推荐

