使用AWK比较文本两列按规则生成新列的实现问题
原有代码错误原因
- 相等判断误用赋值运算符:
if($4=$14)中的=是赋值操作,会直接把第14列的值覆盖到第4列,且该判断永远返回真,逻辑完全错误,相等比较需要使用==运算符。 - 输出逻辑错误:原有代码仅打印新增的第16列,没有输出原有15列的全部内容,无法得到完整的结果文件。
正确实现代码
如果你的文件是制表符分隔,使用以下命令:
awk 'BEGIN{FS=OFS="\t"} NR==1 {print $0, "noneff"} NR>1 { $16 = ($4 == $14) ? $15 : $14; print $0 }' input.txt > output.txt
如果你的文件是空格分隔,去掉BEGIN块的分隔符设置即可:
awk 'NR==1 {print $0, "noneff"} NR>1 { $16 = ($4 == $14) ? $15 : $14; print $0 }' input.txt > output.txt
代码说明
NR==1处理表头行,在原有表头末尾新增noneff列名- 数据行使用三目运算符做判断:如果第4列与第14列值相等,新增的第16列赋值为第15列的值;否则赋值为第14列的值
- 最终输出包含原有全部列+新增
noneff列的完整行
内容的提问来源于stack exchange,提问作者kllrdr
相关产品推荐
相关产品推荐

