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`?我现在已经简化了所需的输出文件。谢谢