如何提取制表符分隔文件中含缺失基因型(./.)的列表头?
解决方案
直接用单条awk命令就能完成需求,无需嵌套调用:
BEGIN {FS="\t"} NR==1 { for (i=1; i<=NF; i++) header[i] = $i next } { for (i=1; i<=NF; i++) { if ($i == "./.") has_missing[i] = 1 } } END { for (i=2; i<=NF; i++) { if (has_missing[i]) print header[i] } }
将上述命令保存为脚本或者直接运行:awk -f script.awk your_file.txt,就能得到预期输出。
命令说明
BEGIN {FS="\t"}:指定输入文件的分隔符为制表符,确保正确识别每一列。- 第一行(
NR==1):把所有列的表头存入header数组,然后跳过当前行的后续处理。 - 后续每一行:遍历所有列,只要某列出现
./.,就给该列标记has_missing[i]=1。 END块:从第2列开始(因为第1列是位点名称,不是患者ID),遍历所有列,输出标记过有缺失数据的列对应的表头。
原代码问题分析
你之前的嵌套awk写法逻辑混乱:
- 第一个awk的
printf NR==1, sep "\n"语法错误,无法正确生成列索引。 - 试图通过变量传递列索引的方式不可靠,容易出现语法解析问题。
内容的提问来源于stack exchange,提问作者kiru
相关产品推荐
相关产品推荐

