Unix环境下使用awk/sed替换文件第6列非1/2值为-9的问题处理
错误原因
- 手动拼接每个字段的写法容错性极低,当部分行第六列默认缺失(值为空)时,极易出现分隔符丢失的问题,你遇到的字段粘连就是手动拼接时的空格逻辑异常导致的。
- 完全不需要手动拼所有字段,直接修改指定字段后打印整行即可,awk会自动用默认的空格作为输出分隔符拼接所有字段。
正确实现命令
直接运行以下命令即可得到符合要求的new.fam:
awk '{$6 = ($6 == 1 || $6 == 2) ? $6 : -9}1' old.fam > new.fam
命令解释
- 核心逻辑:对每一行的第六列做判断,如果值为1或2则保留原值,否则赋值为-9
- 末尾的
1是awk的简写规则,等价于{print $0},即打印修改后的整行 - awk会自动处理输出字段的空格分隔,不管原行第六列是否存在,都会保证第五、第六列之间有空格分隔,不会出现粘连问题
如果偏好if else写法,修改为以下格式也可以正常运行:
awk '{ if ($6==1 || $6==2) {print $0} else {$6=-9; print $0} }' old.fam > new.fam
内容的提问来源于stack exchange,提问作者Aryh
相关产品推荐
相关产品推荐

