基于第一列内容的单独字段,在第二列中匹配并在awk中在第四列中减去

问题描述 投票:0回答:1

我的输入文件就像:

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
1个回答
0
投票

您能不能尝试以下操作。

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


[更通用的解决方案:如果您不想对第一个数组a中的字段值进行硬编码,并且第一个文件中有4个以上的字段,请尝试以下操作。

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
© www.soinside.com 2019 - 2024. All rights reserved.