通过匹配三列合并两个文件+计算输出的平均值

Merging two files by matching of three columns + calculating mean for the output

我在基于三个单独的列合并文件时遇到了一个小问题。首先,我的代码和文件结构以及有关下面我的问题的更多详细信息。到目前为止,这是我的设置:

#making directories
subprocess.call( """ mkdir %s/junctions """%(temp_dir), shell=True)
subprocess.call( """ mkdir %s/out """%(temp_dir), shell=True)

#opening a file with paths to other files
with open(sys.argv[2],"r") as j:
    #creating the output file
    subprocess.call( """ touch %s/junctions/catjunc.txt  """%(temp_dir), shell=True)

    for line in j:
        #reformatting the input file (not important for this question)
        command = """awk 'BEGIN{OFS="\t"}{print , -20-1, +20, "JUNCBJ"NR"%s", , ( == 1)? "+":"-",-20-1, +20, "255,0,0", 2, "20,20", "0,300", ,  , , }' %s > %s"""%(line[:-1].split(".")[0].split("/")[-1],line[:-1],temp_dir + "/junctions/junc.bed")
        subprocess.call( command, shell=True)

        # So here i basically concatenate the files. However, I also want to reduce them.
        subprocess.call( """ cat %s >> %s/junctions/catjunc.txt """%( temp_dir + "/junctions/junc.bed", temp_dir), shell=True)

文件:

chrom   start   stop    ID                                                                                              count1  count2
1       14809   14989   JUNCBJ1adipose_HS110_50bp_SJ    0       -       14809   14989   255,0,0 2       20,20   0,300   0       59      2       1
1       14809   15815   JUNCBJ2adipose_HS110_50bp_SJ    0       -       14809   15815   255,0,0 2       20,20   0,300   0       2       2       1
1       15018   15815   JUNCBJ4adipose_HS110_50bp_SJ    0       -       15018   15815   255,0,0 2       20,20   0,300   0       76      2       1
1       15927   16626   JUNCBJ5adipose_HS110_50bp_SJ    0       -       15927   16626   255,0,0 2       20,20   0,300   0       4       2       1
1       16745   16873   JUNCBJ6adipose_HS110_50bp_SJ    0       -       16745   16873   255,0,0 2       20,20   0,300   0       2       2       1 

我所有的文件都是这样的。在第 1,2 和 3 列中是染色体以及起始和终止坐标。第 12 和 13 列是一些计数。第 4 列是行 ID。 现在我的问题。连接两个文件时,我想保留所有唯一行。但是,当有两行的前三列都相同时,我只想包括两行中的一行,其中计数值被两个计数列(12 和 13)的平均值替换。我还想附加两个 ID(目前并不重要)。

示例:

文件 1:

1       14809   14989   JUNCBJ1adipose_HS110_50bp_SJ    0       -       14809   14989   255,0,0 2       20,20   0,300   10       59      2       1
1       14809   15815   JUNCBJ2adipose_HS110_50bp_SJ    0       -       14809   15815   255,0,0 2       20,20   0,300   0       2       2       1 

文件 2:

1       14809   14989   JUNCBG2adipose_HS110_50bp_SJ    0       -       14809   14989   255,0,0 2       20,20   0,300   20       41      2       1

此处,第一行出现在计数为 10 和 59 以及计数为 20 和 41 的两个文件中。在输出文件中,该行出现一次,计数为 15 和 50。第二行只是复制。

输出:

                                                                                                                                                     replaced means
1       14809   14989   JUNCBJ1adipose_HS110_50bp_SJ,JUNCBG2adipose_HS110_50bp_SJ    0       -       14809   14989   255,0,0 2       20,20   0,300   15       50      2       1
1       14809   15815   JUNCBJ2adipose_HS110_50bp_SJ    0       -       14809   15815   255,0,0 2       20,20   0,300   0       2       2       1 

如果我遗漏了任何细节,我很乐意编辑 post。请不要评判我的python-bash混和

干杯。

使用 awk。您文件中的字段分隔符是 space(s),因此值 10 和 59 在字段 13 和 14 中(awk 中的 </code> 和 <code>)。如果字段分隔符是制表符而不是在第一个 { 之前添加 BEGIN{FS=OFS="\t"} (未经测试但有根据的猜测,其词是演示效果的邀请)并将所有 13 替换为 12 并将 14 替换为 13 (按此顺序;).

$ awk '
{
    a13[,,]+=                # sum field 13
    a14[,,]+=                # sum field 14
    ="XX"                          # set a replaceable key to 
    ="YY"                          # see above
    a0[,,]=[=10=]                   # now store the record
    an[,,]++                    # count instances of ,,
}
END {                                 # after all the records
    for(i in a0) {                    # loop all stored records
        sub(/XX/,a13[i]/an[i],a0[i])  # replace XXs with means
        sub(/YY/,a14[i]/an[i],a0[i])  # and YY
        print a0[i] }                 # output
}' file1 file2
1 14809 15815 JUNCBJ2adipose_HS110_50bp_SJ 0 - 14809 15815 255,0,0 2 20,20 0,300 0 2 2 1
1 14809 14989 JUNCBG2adipose_HS110_50bp_SJ 0 - 14809 14989 255,0,0 2 20,20 0,300 15 50 2 1

当然,如果关键字 XXYY 出现在数据中,您 运行 就会遇到问题,但请相应地选择它们。