Awk 根据满足第二个文件指定的条件的文件中的值更新计数

Awk 根据满足第二个文件指定的条件的文件中的值更新计数,awk,Awk,我有两个文件,我想用一个新列更新文件A,该列包含文件B的$2中的数字在文件A的$2和$3范围内下降的次数,但仅当两个文件中的$1匹配时 文件A n01 2000 9000 n01 29000 41000 n01 60000 89000 n05 10000 15000 n80 5000 12000 n80 59000 68000 n80 100000 110000 文件B n01 6000 n01 6800 n01 35000 n05 14000 n80 65000 n80 104000 预期

我有两个文件,我想用一个新列更新文件A,该列包含文件B的$2中的数字在文件A的$2和$3范围内下降的次数,但仅当两个文件中的$1匹配时

文件A

n01 2000 9000
n01 29000 41000
n01 60000 89000
n05 10000 15000
n80 5000 12000
n80 59000 68000
n80 100000 110000
文件B

n01 6000
n01 6800
n01 35000
n05 14000
n80 65000
n80 104000
预期产出

n01 2000 9000 2
n01 29000 41000 1 
n01 60000 89000 0
n05 10000 15000 1
n80 5000 12000 0
n80 59000 68000 1
n80 100000 110000 1

不完全是严格的awk,但您可以使用一些bash util来帮助您的脚本,如下所示:

join fileA fileB -a1 | awk '{ key=$1 " " $2 " " $3; if (! (key in array) ){array[key]=0} } $4>=$2 && $4<=$3{key=$1 " " $2 " " $3; array[key]=array[key] + 1;  }END{ for(val in array){print val" "array[val]} }' | sort -n
join fileA fileB-a1 | awk'{key=$1”“$2”“$3;if(!(数组中的键)){array[key]=0}}}$4>=$2&$4
awk'
FNR==NR{
A[$1,$2]
下一个
}
{
c=0
为了(我在A)
{
拆分(i、X、子集)
如果(X[1]==1美元)
{

如果(X[2]>=$2&&X[2]你试过什么吗?你有什么特别的问题吗?我同意@TomFenech。投票结束是“太宽”展示你的尝试对我们所有人来说都是最好的:我们将能够帮助你被困在哪里,你将更有可能得到一些答案。一些解释将是有用的。此外,你可能想考虑写一个AWK脚本,并使用<代码> AWK-F Script。AWK Fielb Fiela<代码>,而不是U。唱“一句台词”。如果你愿意,你可以唱。这会让你的答案更好。
  awk '
  FNR==NR{
              A[$1,$2]
              next
         }
         {
           c = 0
           for(i in A)
           {
              split(i,X,SUBSEP)
              if(X[1] == $1)
              {
                if(X[2] >= $2 && X[2] <= $3)
                {
                    c++
                }
              }
           }
           print $0,c
        }
       ' fileB fileA