通过匹配三列合并两个文件+计算输出的平均值
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
当然,如果关键字 XX
和 YY
出现在数据中,您 运行 就会遇到问题,但请相应地选择它们。
我在基于三个单独的列合并文件时遇到了一个小问题。首先,我的代码和文件结构以及有关下面我的问题的更多详细信息。到目前为止,这是我的设置:
#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
当然,如果关键字 XX
和 YY
出现在数据中,您 运行 就会遇到问题,但请相应地选择它们。