gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:19:00 25 4
gpt4 key购买 nike

我正在尝试匹配所有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com