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

时间:2014-10-23 13:17:29

标签: 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

预期输出

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

2 个答案:

答案 0 :(得分:1)

  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

答案 1 :(得分:0)

不完全严格的awk,但你可以用这样的bash工具来帮助你的脚本:

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命令连接两个文件。然后在AWK中创建一个数组,并在每次满足所需条件时求和。最后,您可能希望对输出进行排序以获取按键排序的元素。