Shell 我需要合并两个文件并创建一个新文件

Shell 我需要合并两个文件并创建一个新文件,shell,awk,Shell,Awk,输入1 1106112122C:0.983607G:0.0163934 输入2 110611rs146752890CG100通AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;速率=0.0031;VT=SNP;AA=。;θ=0.0127;LDAF=0.0902;SNPSOURCE=低cov;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;欧元每盎司=0.07欧元 这里 第一列和第二列是匹配的,第一个文件第五列的“:”之前的值

输入1

1106112122C:0.983607G:0.0163934

输入2

110611rs146752890CG100通AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;速率=0.0031;VT=SNP;AA=。;θ=0.0127;LDAF=0.0902;SNPSOURCE=低cov;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;欧元每盎司=0.07欧元

这里 第一列和第二列是匹配的,第一个文件第五列的“:”之前的值和第二个文件第四列的“:”之前的值是相等的,第二个文件第一列和第五列的第六列(“:”之前的值)是相等的,并且输出是基于此匹配创建的。将从输入和输出行中获得清晰的概念,并且两个文件都是.gz文件

输出

1 10611 rs146752890 C G 100通道AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;速率=0.0031;VT=SNP;AA=。;θ=0.0127;LDAF=0.0902;SNPSOURCE=低cov;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;欧元=0.07REF=0.983607;ALT=0.0163934

这应该可以工作(假设您有足够的磁盘空间来存储扩展的.gz文件):


这里有一种使用awk的方法:

awk 'FNR==NR { split($5,a,":"); split($6,b,":"); c[$1,$2,a[1],b[1]]="REF=" a[2] ";ALT=" b[2] ";"; next } ($1,$2,$4,$5) in c { print $0 ";" c[$1,$2,$4,$5] }' input1 input2
结果:

1 10611 rs146752890 C G 100 PASS AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;ERATE=0.0031;VT=SNP;AA=.;THETA=0.0127;LDAF=0.0902;SNPSOURCE=LOWCOV;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;EUR_AF=0.07;REF=0.983607;ALT=0.0163934;
1 10611 rs146752890 C G 100 PASS REF=0.983607;ALT=0.0163934;AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;ERATE=0.0031;VT=SNP;AA=.;THETA=0.0127;LDAF=0.0902;SNPSOURCE=LOWCOV;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;EUR_AF=0.07;
因此,对于压缩文件,请尝试:

awk 'FNR==NR { split($5,a,":"); split($6,b,":"); c[$1,$2,a[1],b[1]]="REF=" a[2] ";ALT=" b[2] ";"; next } ($1,$2,$4,$5) in c { print $0 ";" c[$1,$2,$4,$5] }' <(gzip -dc input1.gz) <(gzip -dc input2.gz) | gzip > output.gz
结果:

1 10611 rs146752890 C G 100 PASS AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;ERATE=0.0031;VT=SNP;AA=.;THETA=0.0127;LDAF=0.0902;SNPSOURCE=LOWCOV;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;EUR_AF=0.07;REF=0.983607;ALT=0.0163934;
1 10611 rs146752890 C G 100 PASS REF=0.983607;ALT=0.0163934;AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;ERATE=0.0031;VT=SNP;AA=.;THETA=0.0127;LDAF=0.0902;SNPSOURCE=LOWCOV;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;EUR_AF=0.07;

所有8列都应该用制表符空格分隔。你能重新排列命令吗?这将用制表符替换空格:
join new1 new2-11-21-o“2.2 2.3 2.4 2.5 2.6 2.7 2.9 1.6 1.7”| sed's/C:/;REF=/'| sed's/G:/;ALT=/'| sed's//\t/g'>输出
C和g正在更改。这里我给出了一个示例,两个文件都包含超过100万个REORD。**第一列和第二列是匹配的,第一个文件第五列和第二个文件第四列的“:”前面的值等于第六列(在“:”之前的值)第一和第第五列的第二个文件是平等和输出正在创建基于这个匹配。将得到清晰的想法从输入和输出线,这两个文件是.gz文件***。只考虑列没有价值我尝试这个命令之前AWK’fnr==nr {分裂($ NF,A,“:”);B [ 1美元,2 ] =下[ 2 ];下一个}(1美元,2美元)在B {打印$0”;ALT=“B[1,$2 ] }'可以添加参考值=0.983607;ALT=0.0163934;第8列开头的字段。如1 10611 rs146752890 C G 100 PASS REF=0.983607;ALT=0.0163934;AC=184;RSQ=0.8228;AVGPOST=0.9640;AN=2184;速率=0.0031;VT=SNP;AA=。;θ=0.0127;LDAF=0.0902;SNPSOURCE=低cov;AF=0.08;ASN_AF=0.08;AMR_AF=0.14;AFR_AF=0.08;欧元=0.07;你刚刚抓住我了。我去睡觉了。让我看看能不能先做这个,没关系!简单:-)请参见上面的编辑。我将在5-6小时后重新上线。祝你好运!上面的代码正在运行,但是每一列都应该用制表符空格分隔。现在列之间有空格。用制表符空格替换