首页 > 解决方案 > 如果第 2 列相同,则减去第 1 列中的值

问题描述

我有以下格式的文件:

0.019059000     15150000000
0.037088000     15150000000
0.035007000     15150000001
0.047622000     15150000001
0.053359000     15150000002
0.060405000     15150000002
0.068598000     15150000003
0.081587000     15150000003

当第 2 列相同时,我想减去第 1 列。例如对于输入文件,我想要这样的东西:

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

输入文件第 2 列上的所有值成对出现,例如 15150000000 仅存在两次,15150000001 仅存在两次等。

任何帮助都非常受欢迎!

标签: bashawk

解决方案


awk救援!(没有错误检查。)

$ awk 'p==$2 {print $1-pv,p} {p=$2; pv=$1}' file

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

对于同一键的未排序但又重复的记录

$ awk '$2 in a {print $1-a[$2],$2; delete a[$2]; next} {a[$2]=$1}' file

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

如果第二个值并不总是大于第一个值并且您想要绝对差

$ awk 'function abs(x) {return x<0?-x:x}
       $2 in a {print abs($1-a[$2]),$2; delete a[$2]; next} 
               {a[$2]=$1}' file

推荐阅读