awk将文件1与文件2和平均字段7匹配

awk将文件1与文件2和平均字段7匹配,awk,Awk,我正在尝试匹配文件2中的所有文件1名称,如果存在匹配项,则对其进行平均。匹配的字段是|符号前面的$5,平均值是匹配$4的$7的总和。谢谢:) 文件1 AGRN CYP2J2 文件2 chr1 955543 955763 chr1:955543 AGRN-6|gc=75 1 2 chr1 955543 955763 chr1:955543 AGRN-6|gc=75 2 2 chr1 955543 955763 chr1:955543 AGRN-

我正在尝试匹配
文件2
中的所有
文件1
名称,如果存在匹配项,则对其进行平均。匹配的字段是
|
符号前面的
$5
,平均值是匹配
$4
$7
的总和。谢谢:)

文件1

AGRN 
CYP2J2
文件2

chr1    955543  955763  chr1:955543 AGRN-6|gc=75    1   2
chr1    955543  955763  chr1:955543 AGRN-6|gc=75    2   2
chr1    955543  955763  chr1:955543 AGRN-6|gc=75    3   2
chr1    957571  957852  chr1:957571 AGRN-7|gc=61.2  1   148
chr1    957571  957852  chr1:957571 AGRN-7|gc=61.2  2   149
chr1    957571  957852  chr1:957571 AGRN-7|gc=61.2  3   151
chr1    60381600    60381782    chr1:60381600   CYP2J2-1596|gc=40.7 153 274
chr1    60381600    60381782    chr1:60381600   CYP2J2-1596|gc=40.7 154 273
所需输出(制表符分隔)

到目前为止,我已经尝试过:

awk '
 FNR==NR{d[$0]; next;}          
 {                              
     for(k in d){               
         pat="(^|;)"k":";       
         if($5 ~ pat){
             print;             
             break;
         }
     }
 }' file 1 file2 > output.bed

awk
确实运行,但输出文件到目前为止为0字节。谢谢:)。

脚本应如下所示:

test.awk

可以这样说:

awk -f test.awk file1 file2
顺便说一句,您预期输出中的第三个平均值是错误的。输出应如下所示:

chr1:955543 AGRN-6 2
chr1:957571 AGRN-7149.333
chr1:60381600 CYP2J2-1596 273.5

这行中的
-7
发生了什么
chr1:957571 AGRN 149.3
。还有,哪个字段是键$4或$5的一部分,或者两者都是?为什么第一行是AGRN-6,而第二行只是AGRN?为什么要在模式中添加冒号?文件2$5中没有冒号。使用
pat=“^”k”-”
@karakfa部分
$5
是关键,
$7
构成平均值(149.3)。谢谢:)。当我运行时,会生成一个输出文件,但它也是零字节。谢谢:)。原始文件选项卡是否有分隔符?我已将tab添加到潜在分隔符列表中。重试。生成的输出为
chr1:60381600 CYP2J2-1596 273.5
上面的两行不匹配。File1只是列中的名称列表。谢谢:)。你能用你在stackoverflow上发布的数据运行它吗?它起作用了!如果它在家里不起作用,那么你在这里发布了错误的数据。第一行后面有一个空格,导致
awk
看不到它。。。。谢谢你的帮助:)。
BEGIN {
  FS="[ \t|]*"
}
# Read search terms from file1 into 's'
FNR==NR {
    s[$0]
    next
}
{
    # Check if $5 matches one of the search terms
    for(i in s) {
        if($5 ~ i) {

            # Store first two fields for later usage
            a[$5]=$1
            b[$5]=$2

            # Add $9 to total of $9 per $5
            t[$5]+=$8
            # Increment count of occurences of $5
            c[$5]++

            next
        }
    }
}
END {

    # Calculate average and print output for all search terms
    # that has been found
    for( i in t ) {
        avg = t[i] / c[i]
        printf("%s:%s\t%s\t%s\n", a[i], b[i], i, avg)
    }
}
awk -f test.awk file1 file2