如何用awk高效格式化TSV格式的基因变异数据?
单步Awk优化TSV数据转换
原始数据(data.tsv)
$ cat data.tsv
variant minor_allele minor_AF low_confidence_variant n_complete_samples AC ytx beta se tstat pval 1:69569:T:C C 1.90E-04 TRUE 272338 1.04E+02 1.02E+00 -2.48E-02 7.19E-02 -3.44E-01 7.31E-01 1:139853:C:T T 5.67E-06 FALSE 272338 3.09E+00 1.83E+00 5.00E-01 4.04E-01 1.24E+00 2.16E-01 1:692794:CA:C C 1.11E-01 FALSE 272338 6.05E+04 -3.35E+02 -3.67E-03 3.34E-03 -1.10E+00 2.71E-01 1:693731:A:G G 1.16E-01 FALSE 272338 6.32E+04 -4.94E+02 -6.37E-03 3.16E-03 -2.02E+00 4.35E-02
目标输出(newdata.tsv)
$ cat newdata.tsv
snp A1 A2 beta P n 1:139853 T C 5.00E-01 2.16E-01 272338 1:693731 G A -6.37E-03 4.35E-02 272338
转换要求
- 拆分
variant列到第二个冒号处,保留1:139853格式的SNP标识 - 选择并重命名指定列:映射为
snp、A1(原minor_allele)、A2(原variant列第三个元素)、beta、P(原pval)、n(原n_complete_samples) - 丢弃
low_confidence_variant为TRUE的行 - 仅保留等位基因为
A/T/C/G的双等位基因变异(排除多碱基类型)
原实现方案(两步Awk)
第一步拆分variant列生成中间文件:
awk < data.tsv -F'[:]' '{ print $1 "\t" $2 "\t" $3 "\t" $4, $5 }' > data1.tsv
第二步过滤并整理输出:
awk < data1.tsv '(NR>1){snp1=$1;snp2=$2;a1=$5;a2=$3;beta=$11;P=$14;n=$8}(NR==1){print "SNP A1 A2 beta P n"}(NR>1 && $7=="FALSE" && (a1=="A"||a1=="C"||a1=="G"||a1=="T") && (a2=="A"||a2=="C"||a2=="G"||a2=="T")) {print snp1":"snp2, a1, a2, beta, P, n}' > newdata.tsv
优化后的单步Awk实现
无需中间文件,一次调用完成所有逻辑:
awk 'BEGIN {FS="\t"; OFS="\t"} NR==1 {print "snp", "A1", "A2", "beta", "P", "n"; next} $4 == "FALSE" { split($1, var, ":") a1 = $2 a2 = var[3] if ((a1 ~ /^[ATCG]$/) && (a2 ~ /^[ATCG]$/)) { snp = var[1] ":" var[2] print snp, a1, a2, $8, $11, $5 } }' data.tsv > newdata.tsv
优化点说明
- 用
split()直接拆分variant列,省去中间文件的IO开销 - 正则表达式
/^[ATCG]$/简化等位基因判断,代码更简洁易读 - 明确指定输入输出分隔符为制表符,避免空格/制表符混合导致的列识别错误
- 逻辑流程清晰:先处理表头,再过滤低置信度行,最后验证等位基因并输出
内容的提问来源于stack exchange,提问作者Yannick
相关产品推荐
相关产品推荐

