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

标签 awk

我正在尝试匹配所有 file 1 file 2 中的名字如果匹配,则对它们进行平均。匹配的字段是 $5| 之前符号和平均值是 $7 的总和匹配 $4 .谢谢 :)。

文件 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

所需的输出(制表符分隔)

chr1:955543     AGRN-6     2
chr1:957571     AGRN       149.3
chr1:60381600   CYP2J2-1596     153.5

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

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

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

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

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

关于awk 将文件 1 与文件 2 和平均字段 7 进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736994/

相关文章:

awk,第 4 列与 @ 之前的通配符匹配的所有内容

用于识别用户的 Bash 脚本

bash - 如何将字符串转换为修改后的十六进制表示?

linux - 在 Linux 中拆分平面文件并添加分隔符

awk - 使用 AWK 进行文本操作

perl - sed/awk/perl 删除 3 行模式的前两行

perl - 如何快速解析大(> 10GB)文件?

bash - 从文件生成频率表

linux - 与作为变量传递到 awk 的正则表达式进行比较

linux - 如何打印模式中的第 n 行?