【问题标题】:Create an output file from two input files based on column match根据列匹配从两个输入文件创建输出文件
【发布时间】:2012-11-28 05:43:02
【问题描述】:

我需要使用 linux 命令从两个输入文件创建一个文件

输入 1:

21 33210001 rs60180678 G T 100 PASS AVGPOST=1.0000;RSQ=0.9885;THETA=0.0002;AA=G;AN=2184;VT=SNP;LDAF=0.0019;SNPSOURCE=LOWCOV;AC=4;ERATE=0.0003;AF=0.0018;AFR_AF=0.01 GT:DS:GL

输入 2:

21 33210001 . G T . . ;AA=0.0163934;AFE=0;ASNE=0;EUN=0;AFW=0.0113636;MED=0;LAT=0;VT=SNP;AF=0.0018

预期输出:

21 33210001 rs60180678 G T . . ;AA=0.0163934;AFE=0;ASNE=0;EUN=0;AFW=0.0113636;MED=0;LAT=0;VT=SNP;AF=0.0018

每列由制表符分隔。

根据第 1、2、4 和 5 列匹配创建输出。

out 文件的每一列由制表符分隔。

【问题讨论】:

  • 你尝试了什么?
  • 您查看过join 实用程序吗?

标签: linux bash sed awk


【解决方案1】:

这是awk的一种方式:

awk 'BEGIN { FS=OFS="\t" } FNR==NR { a[$1,$2,$4,$5]=$3; next } ($1,$2,$4,$5) in a { $3=a[$1,$2,$4,$5] }1' file1 file2

结果:

21 33210001 rs60180678 G T . . ;AA=0.0163934;AFE=0;ASNE=0;EUN=0;AFW=0.0113636;MED=0;LAT=0;VT=SNP;AF=0.0018

【讨论】:

  • 我忘了补充一点,两个输入文件都是 .gz 文件(已压缩) .**file1.vcf.gz** 和 file2.vcf.gz 输出将是file3.vcf.gz
  • @user1782877:只需将file1 file2 更改为:`<(gzip -dc input1.vcf.gz) <(gzip -dc input2.vcf.gz) | gzip > output.vcf.gz
【解决方案2】:

另一种解决方案:

awk 'BEGIN{FS=OFS="\t"}{getline a < "file2"; split(a,b,"\t");print $1,$2,$3,$4,$5,b[6],b[7],b[8]}' file1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多