Awk 在一列中查找repeat,然后在另一列中减去value

Awk 在一列中查找repeat,然后在另一列中减去value,awk,Awk,我的输入文件列是: a Otu1 w 4 b Otu1 x 1 c Otu2 y 12424 d Otu3 z 1756 我想搜索第二列的每个重复,减去第四列中的值。我期望的结果是: a Otu1 w 3 c Otu2 y 12424 d Otu3 z 1756 我在一个包含两列的小文件中尝试了以下awk脚本 a 3 a 1 b 4 awk '$1 in a{print $1

我的输入文件列是:

a   Otu1    w   4
b   Otu1    x   1
c   Otu2    y   12424
d   Otu3    z   1756
我想搜索第二列的每个重复,减去第四列中的值。我期望的结果是:

a    Otu1   w   3
c   Otu2    y   12424
d   Otu3    z   1756
我在一个包含两列的小文件中尝试了以下awk脚本

a    3
a    1
b    4

awk '$1 in a{print $1, a[$1]-$2} {a[$1]=$2}' small_input_file
这只给了我减法的值

a    2
如何为包含四列的输入文件修改此脚本


谢谢。

双扫描算法不在乎有多少条记录,也不在乎它们是否连续

$ awk 'NR==FNR  {a[$2]=$2 in a?a[$2]-$4:$4; next} 
       !b[$2]++ {print $1,$2,$3,a[$2]}' file{,}

a Otu1 w 3
c Otu2 y 12424
d Otu3 z 1756

双扫描算法不关心有多少条记录,也不关心它们是否连续

$ awk 'NR==FNR  {a[$2]=$2 in a?a[$2]-$4:$4; next} 
       !b[$2]++ {print $1,$2,$3,a[$2]}' file{,}

a Otu1 w 3
c Otu2 y 12424
d Otu3 z 1756

以下是以awk默认顺序输出的单次过程:

$ awk '{
    if($2 in a)                  # current $2 met before
        b[$2]-=$4                # subtract $4
    else {                       # first time meet current $2
        a[$2]=$0                 # store record to a var
        b[$2]=$4                 # and $4 to another, key with $2
    }
}
END {                            # after processing
    for(i in a) {                # iterate all stored records
        sub(/[^ ]+$/,b[i],a[i])  # replace the last space separated string with the count
        print a[i]               # output
    }
}' file
输出顺序显示为随机:

d   Otu3    z   1756
a   Otu1    w   3
c   Otu2    y   12424

以下是以awk默认顺序输出的单次过程:

$ awk '{
    if($2 in a)                  # current $2 met before
        b[$2]-=$4                # subtract $4
    else {                       # first time meet current $2
        a[$2]=$0                 # store record to a var
        b[$2]=$4                 # and $4 to another, key with $2
    }
}
END {                            # after processing
    for(i in a) {                # iterate all stored records
        sub(/[^ ]+$/,b[i],a[i])  # replace the last space separated string with the count
        print a[i]               # output
    }
}' file
输出顺序显示为随机:

d   Otu3    z   1756
a   Otu1    w   3
c   Otu2    y   12424

a-b应该代表什么?只是用连字符连接的列值吗?接下来会发生什么:Otu1`?我现在已经简化了所需的输出文件。谢谢a-b代表什么?只是用连字符连接的列值吗?接下来会发生什么:Otu1`?我现在已经简化了所需的输出文件。谢谢