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