如何基于TSV文件INFO列的AF_SAS条件过滤行
筛选TSV文件中满足AF_SAS条件的行
需求说明
有一个大型制表符分隔(TSV)文件,第8列(INFO列)包含多个用;分隔的key=value对,需筛选出满足AF_SAS = 0或AF_SAS < 0.05条件的行。
解决方案
使用awk工具处理,它适合处理大型文本文件,无需加载整个文件到内存,执行效率较高。
核心思路
- 以制表符作为列分隔符,识别文件的各列;
- 直接输出标题行;
- 对数据行拆分INFO列的键值对,提取
AF_SAS对应的数值; - 判断数值是否符合条件,符合则输出整行。
命令实现
脚本形式(便于复用)
将以下代码保存为filter_af_sas.awk:
BEGIN { FS = "\t" } # 输出标题行 NR == 1 { print; next } { # 拆分INFO列的键值对 n = split($8, info_pairs, ";") af_sas_value = -1 # 遍历查找AF_SAS的值 for (i = 1; i <= n; i++) { if (info_pairs[i] ~ /^AF_SAS=/) { split(info_pairs[i], kv, "=") af_sas_value = kv[2] + 0 # 转换为数值类型 break } } # 判断条件并输出 if (af_sas_value == 0 || af_sas_value < 0.05) { print } }
执行命令:
awk -f filter_af_sas.awk input.tsv > output.tsv
单行命令形式
直接在终端运行:
awk 'BEGIN{FS="\t"} NR==1{print;next} {n=split($8,info,";");af=-1;for(i=1;i<=n;i++){if(info[i]~/^AF_SAS=/){split(info[i],kv,"=");af=kv[2]+0;break}} if(af==0 || af<0.05) print}' input.tsv > output.tsv
结果验证
针对提供的测试TSV文件,该命令会过滤掉AF_SAS=0.23415的行(第5行),生成与期望输出完全一致的结果。
内容的提问来源于stack exchange,提问作者Luffy
相关产品推荐
相关产品推荐

