根据第一列内容分离字段,在第二列中匹配,并在awk的第四列中减去值

根据第一列内容分离字段,在第二列中匹配,并在awk的第四列中减去值,awk,Awk,我的输入文件如下所示: a10 otu1 xx 44 b24 otu2 xxx 52 x35 otu3 xy 11 x45 otu3 zz 22 z452 Otu5 rr 78 control1 otu1 w 4 control2 otu2 ee 30 control3 otu3 tt 20 control4 otu4 yy 10 首先,我想将控件与第1列中的其他控件分开,然后匹配第二列 控件的值与其他控件的第二列。我想在第二列中找到匹配项的位置 减去第四列中的相应值 输出文件将是: a10

我的输入文件如下所示:

a10 otu1 xx 44
b24 otu2 xxx 52
x35 otu3 xy 11
x45 otu3 zz 22
z452 Otu5 rr 78
control1 otu1 w 4
control2 otu2 ee 30
control3 otu3 tt 20
control4 otu4 yy 10
首先,我想将控件与第1列中的其他控件分开,然后匹配第二列 控件的值与其他控件的第二列。我想在第二列中找到匹配项的位置 减去第四列中的相应值

输出文件将是:

a10 otu1 xx 40
b24 otu2 xxx 22
x35 otu3 xy -9
x45 otu4 zz 12
z452 Otu5 rr 78
现在,为了匹配第二列并减去第四列中的值,我使用:

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

如何在脚本中输入单独的字段信息(控件与其他控件)?

请尝试以下内容

awk '
!/^control/{
  a[++count1]=$NF
  b[count1]=$1 OFS $2 OFS $3
  next
}
{
  c[++count2]=$NF
}
END{
  for(i=1;i<=count1;i++){
    print b[i],a[i]-c[i]
  }
}
'   Input_file
awk '
!/^control/{
  a[++count1]=$NF
  $NF=""
  sub(/ +$/,"")
  b[count1]=$0
  next
}
{
  c[++count2]=$NF
}
END{
  for(i=1;i<=count1;i++){
    print b[i],a[i]-c[i]
  }
}
' Input_file
awk'
!/^控制/{
a[++count1]=$NF
b[count1]=1美元OFS$2 OFS$3
下一个
}
{
c[++count2]=$NF
}
结束{

对于(i=1;i这是另一种观点:

/^control/ {
  a[$2]=a[$2]-$4
  next
}

{
  a[$2]=a[$2]+$4
  b[$2]=$1 OFS $2 OFS $3
}

END {
  for(i in b) print b[i] OFS a[i]
}
这将减去
控件
行上的任何值,添加其他行上的任何值,并将它们存储在数组
a[]
中。它维护一个行内容数组
b[]

通过在数组中存储内容,可能会有多个数据或控制行影响该值,并且它们可以以任意顺序出现在输入中(因为44-40与-40+44相同)


注意,因为我们的循环结束通过数组,输出不能保证与输入的顺序相同。

虽然这可能是OP问题的答案,但是只有代码的答案在StAdvExcel上。请考虑对提供的代码添加一些解释,因为它对OP和未来访问者都有好处。@ SandraRossi,我通常添加。答案的解释会在某个时候加入,然后让你知道。
/^control/ {
  a[$2]=a[$2]-$4
  next
}

{
  a[$2]=a[$2]+$4
  b[$2]=$1 OFS $2 OFS $3
}

END {
  for(i in b) print b[i] OFS a[i]
}