如何用Awk脚本基于指定ICD编码判定患者疾病诊断标签
解决ICD编码矩阵的诊断标签生成问题
需求说明
- 两个输入文件:
- 制表符分隔的
A.tsv:ICD编码矩阵,首列是患者IDstudy_id,其余列名是ICD编码;每行对应一位患者,单元格值为NA代表未诊断该编码,非NA代表有诊断 - 关注ICD编码文件:每行第一列是需要重点关注的ICD编码,第二列是编码类型(可忽略)
- 制表符分隔的
- 生成规则:只要患者在任意一个关注ICD编码对应的列中值不是
NA,诊断标签设为1;否则设为0
文件示例
A.tsv内容
study_id 691.8 692.9 701.2 706.1 a1 1 NA NA 2 a2 NA NA NA NA a3 NA NA 1 NA
关注ICD编码文件内容
691.8 ICD_9 706.1 ICD_10
预期输出
study_id diagnosis a1 1 a2 0 a3 0
现有脚本的问题
原脚本错误地把单元格里的数值当成ICD编码去匹配关注列表,但实际矩阵的列名才是ICD编码,单元格值是诊断状态。这导致脚本逻辑完全偏离需求,无法正确筛选关注的编码列。
修正后的Awk脚本
awk -F"\t" 'BEGIN { OFS="\t"; } # 读取关注ICD文件,将目标编码存入数组 NR==FNR { icd_target[$1] = 1; next; } # 处理A.tsv表头,记录目标ICD对应的列位置 FNR==1 { print "study_id", "diagnosis" for (i=2; i<=NF; i++) { if ($i in icd_target) { target_cols[i] = 1 # 标记需要检查的列索引 } } next; } # 处理患者数据行,判断诊断标签 { diagnosis = 0 # 只遍历标记过的目标列 for (i in target_cols) { if ($i != "NA") { diagnosis = 1 break } } print $1, diagnosis }' 关注ICD编码文件路径 A.tsv > 输出文件路径
修正逻辑说明
- 先读关注ICD文件,把需要关注的编码存入
icd_target数组,用1标记存在 - 处理
A.tsv的表头时,遍历所有列名,把属于关注ICD的列位置记录到target_cols数组 - 处理患者数据行时,只检查
target_cols里的列:只要有一个列的值不是NA,就把诊断标签设为1 - 全程保持制表符分隔的输入输出格式,和原文件格式一致
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

