如何使用awk批量替换文件指定列中的特定数值为目标值
命令错误原因
- 两条命令独立运行,第二条命令的输出直接覆盖了第一条的输出结果,第一条的修改完全没有生效
- 逻辑顺序错误:即使你把两条命令的修改逻辑合并,先把0替换为1,再把所有1替换为2,会导致原本是0的数值最终被误替换为2,和你的需求完全相悖
gsub是全局字符串替换函数,不适用于精准的数值匹配场景,后续如果第三列出现其他包含0/1字符的数值,很容易出现意料之外的替换错误
正确实现方案
仅需执行一次以下命令即可完成所有替换需求:
如果你的原文件是制表符分隔,希望保留原格式:
awk 'BEGIN{OFS="\t"} $3 == 0 {$3 = 1} $3 == 1 || $3 == 2 {$3 = 2} 1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
如果你的原文件是空格分隔:
awk '$3 == 0 {$3 = 1} $3 == 1 || $3 == 2 {$3 = 2} 1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
命令逻辑说明
- 首先判断第三列数值是否为0,是则赋值为1
- 再判断第三列数值是否为1或2,是则赋值为2
- 既不是0/1/2的数值(比如你的-9)不做任何修改,直接保留
- 末尾的
1是awk的常用简写,等价于{print $0},作用是输出处理后的整行内容
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

