我有以下数据作为输入。我试图找到每个组的增量。

col1    col2    col3    group
1        2      100  alpha
1        2      100  alpha
1        2      100  alpha
3        4      200  beta
3        4      200  beta
3        4      200  beta
3        4      300  beta
5        6      700  charlie
7        8      400  tango
7        8      300  tango
7        8      700  tango

示例输出:
tango: 300
charlie:0
beta:100
alpha:0

我正在尝试这种方法,但答案是不正确的,因为有时样本之间的值会增加:
awk 'NR>1{print $NF}' foo |while read line;do grep -w $line foo|sort -k3n ;done |awk '!a[$4]++' |sort -k4
1       2       100     alpha
3       4       200     beta
5       6       700     charlie
7       8       300     tango
awk 'NR>1{print $NF}' foo |while read line;do grep -w $line foo|sort -k3n ;done |tac|awk '!a[$4]++' |sort -k4
1       2       100     alpha
3       4       300     beta
5       6       700     charlie
7       8       700     tango

最佳答案

Awk溶液:

awk 'NR==1{ next }
     g && $4 != g{ print g":"(v - gr[g]) }
     !($4 in gr){ gr[$4]=$3 }{ g=$4; v=$3 }
     END{ print g":"(v - gr[g]) }' file

NR==1{ next }-跳过第一条记录
g-用于保存组名的变量
v-旨在保持组值的变量
!($4 in gr){ gr[$4]=$3 }-在第一次出现不同的组名时,将其第一个值$4保存到数组$3
gr-如果当前组名与上一个组名不同,则打印上一个组的最后和第一个值之间的差值
输出:
alpha:0
beta:100
charlie:0
tango:300

关于bash - 检测任何列中的增量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48379335/

10-11 17:02