You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

制表符分隔文件处理:根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:42:31