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

时间:2017-06-06 15:43:36

标签: python bash merge multiple-columns mean

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

#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 $1, $2-20-1, $3+20, "JUNCBJ"NR"%s", $7, ($4 == 1)? "+":"-",$2-20-1, $3+20, "255,0,0", 2, "20,20", "0,300", $7, $8 ,$5 , $6}' %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 

file2的:

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 

如果我遗漏了任何细节,我很乐意编辑这篇文章。请不要判断我的python-bash混音和

干杯。

1 个答案:

答案 0 :(得分:0)

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

$ awk '
{
    a13[$1,$2,$3]+=$13                # sum field 13
    a14[$1,$2,$3]+=$14                # sum field 14
    $13="XX"                          # set a replaceable key to $13
    $14="YY"                          # see above
    a0[$1,$2,$3]=$0                   # now store the record
    an[$1,$2,$3]++                    # count instances of $1,$2,$3
}
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出现在您遇到问题的数据中,请相应地选择它们。