如何使用awk计算TSV文件两列绝对差值并新增为第四列
问题背景
待处理TSV文件内容:
Hi 10 6 hello 7 1 Hi 6 2
需求:新增第四列,取值为第二列、第三列差值的绝对值,期望输出:
Hi 10 6 4 hello 7 1 6 Hi 6 2 4
原有执行失败的命令:
awk -F\t '{print $0 OFS $2-$3}' file
正确实现方案
原命令存在3个核心问题:
- 字段分隔符写法错误:
-F\t未加引号包裹时,shell会将\t转义为普通字符t,导致awk无法按制表符正确拆分字段 - 未显式指定输出分隔符:awk默认输出分隔符为空格,无法保持TSV的制表符分隔格式
- 未做绝对值计算:直接做减法
$2-$3会在$3大于$2时输出负数,不符合需求
兼容所有awk版本的命令(无依赖)
awk -F'\t' -v OFS='\t' '{d = $2 - $3; print $1, $2, $3, d < 0 ? -d : d}' file
GNU Awk(绝大多数Linux环境默认awk)简化写法
GNU Awk内置绝对值函数abs(),可以直接调用:
awk -F'\t' -v OFS='\t' '{print $0, abs($2-$3)}' file
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

