基于三个单独的列合并文件时遇到一个小问题。首先,我的代码和文件结构以及有关我的问题的更多详细信息如下。这是我到目前为止的设置:
#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混音和
干杯。
答案 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
当然,如果关键字XX
和YY
出现在您遇到问题的数据中,请相应地选择它们。