【问题标题】:How to compare two columns from two different files, and add columns from file2 to file1 for multiple consecutive columns如何比较来自两个不同文件的两列,并将列从 file2 添加到 file1 以获得多个连续列
【发布时间】:2016-11-15 19:27:40
【问题描述】:

相对较新的编码和使用 awk,所以如果这是一个愚蠢的问题,我深表歉意! 我需要将文件 1 中的 $3 与文件 2 中的 $3 进行比较,如果它们匹配,则将文件 1 中的行与文件 2 中 $10 中的相应行条目打印出来。我有一个执行此操作的命令,

awk 'NR==FNR{a[$3]=$10; next} a[$3] {print $0 "\t" a[$3]}' file2 file1

但是,file2 有 $10-$647 列,我需要对所有 637 列执行上述操作。有没有办法循环这个?

示例文件 1:

 1  715348  rs3131984   T   G   100 PASS    AC=5008;AF=1;AN=5008;NS=2504;DP=16986;EAS_AF=1;AMR_AF=1;AFR_AF=1;EUR_AF=1;SAS_AF=1;AA=.|||;VT=SNP   GT  1|1 1|1 1|1
 1  723798  rs34882115  CAG C   100 PASS    AC=4012;AF=0.801118;AN=5008;NS=2504;DP=24752;EAS_AF=0.7946;AMR_AF=0.8775;AFR_AF=0.5416;EUR_AF=0.9602;SAS_AF=0.9407;VT=INDEL GT  1|1 1|1 1|1
 1  723891  rs2977670   G   C   100 PASS    AC=3906;AF=0.779952;AN=5008;NS=2504;DP=22718;EAS_AF=0.7917;AMR_AF=0.8689;AFR_AF=0.4849;EUR_AF=0.9483;SAS_AF=0.9305;AA=.|||;VT=SNP   GT  1|1 1|1 1|1
 1  729679  rs4951859   C   G   100 PASS    AC=3205;AF=0.639976;AN=5008;NS=2504;DP=18762;EAS_AF=0.6875;AMR_AF=0.7536;AFR_AF=0.2905;EUR_AF=0.841;SAS_AF=0.7761;AA=.|||;VT=SNP    GT  1|0 1|1 1|0
 1  752566  rs3094315   G   A   100 PASS    AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.|||;VT=SNP  GT  0|1 1|1 0|1
 1  752721  rs3131972   A   G   100 PASS    AC=3272;AF=0.653355;AN=5008;NS=2504;DP=22729;EAS_AF=0.7659;AMR_AF=0.7363;AFR_AF=0.2905;EUR_AF=0.839;SAS_AF=0.7781;AA=.|||;VT=SNP    GT  0|1 1|1 0|1
 1  754182  rs3131969   A   G   100 PASS    AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16315;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
 1  754192  rs3131968   A   G   100 PASS    AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16981;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
 1  754334  rs3131967   T   C   100 PASS    AC=3427;AF=0.684305;AN=5008;NS=2504;DP=21917;EAS_AF=0.7629;AMR_AF=0.755;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP    GT  0|1 1|1 0|1
 1  754503  rs3115859   G   A   100 PASS    AC=3325;AF=0.663938;AN=5008;NS=2504;DP=19944;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3374;EUR_AF=0.839;SAS_AF=0.771;AA=.|||;VT=SNP GT  0|1 1|1 0|1
 1  754964  rs3131966   C   T   100 PASS    AC=3322;AF=0.663339;AN=5008;NS=2504;DP=19476;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3366;EUR_AF=0.837;SAS_AF=0.771;AA=.|||;VT=SNP GT  0|1 1|1 0|1
 1  755887  rs3131964   C   G   100 PASS    AC=4905;AF=0.979433;AN=5008;NS=2504;DP=22796;EAS_AF=1;AMR_AF=0.9914;AFR_AF=0.9304;EUR_AF=0.995;SAS_AF=1;AA=.|||;VT=SNP  GT  1|1 1|1 1|1
 1  755890  rs3115858   A   T   100 PASS    AC=3763;AF=0.751398;AN=5008;NS=2504;DP=23185;EAS_AF=0.8839;AMR_AF=0.8242;AFR_AF=0.4539;EUR_AF=0.8728;SAS_AF=0.8405;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
 1  756604  rs3131962   A   G   100 PASS    AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP   GT  0|1 1|1 0|1

示例文件 2:

1   742429  rs3094315   A   G   .   .   .   GT  0/0 0/0
1   1011278 rs3737728   G   A   .   .   .   GT  0/0 0/1
1   1077546 rs9442380   C   T   .   .   .   GT  0/0 0/0
1   1084601 rs4970362   G   A   .   .   .   GT  0/0 0/1
1   1089205 rs9660710   C   A   .   .   .   GT  0/0 0/0
1   1300787 rs2765033   C   T   .   .   .   GT  0/0 0/1
1   756604  rs3131962   A   G   100 PASS    AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP   GT  0|1 1|1
1   1303878 rs2649588   T   C   .   .   .   GT  0/0 0/1
1   1695996 rs6603811   C   T   .   .   .   GT  0/0 0/0
1   1782971 rs10907192  G   A   .   .   .   GT  0/0 0/0
1   1878053 rs3820011   C   A   .   .   .   GT  0/1 0/1
1   1882185 rs2803291   C   T   .   .   .   GT  0/0 0/0

awk 是最好的方法吗?我不太确定如何制作任何类型的循环。非常感谢所有帮助和解释!

【问题讨论】:

  • 所以你想为匹配的每一行打印 637 行?每个字段一个?
  • 我需要打印 637 列,基于跨两个文件的列中的行匹配。
  • @Hannah6746576 - 你检查过这个答案吗? stackoverflow.com/questions/40523371/…
  • 如果能得到一些反馈或标记为答案的东西会很好......
  • 抱歉耽搁了。我运行了 awk only 命令,它已经工作了,但它没有用制表符分隔文件。非常感谢您的帮助和耐心!

标签: bash unix awk


【解决方案1】:

我愿意:

$ column_file1=`awk '{print NF}' file1 | tail -1`
$ paste file1 file2 | awk -v c1=column_file1 '{if($3==$(3+c1)){for(i=1;i<=647;i++)if(i<=c1 || i>c1+10){printf "%s ", $i}; printf "\n"}}'  

paste 只需将两个文件逐行加入即可。

awk 中的第一个if 检查两个文件的第三个字段是否匹配(考虑现在,第二个文件的第一个字段只是$(1+c1))。如果条件为真,则输入一个循环,打印(在同一行 -printf "%s ", $i-)所有字段,避免第二个文件的前 10 个字段(if(i&lt;=c1 || i&gt;c1+10))。循环完成后(因此您已经打印了所有行)转到新行。如果文件结构良好(每个字段的宽度相同),您可以使用print $0 并将输出通过管道传输到colrm

如果您更喜欢只使用 awk

将以下内容复制到文件中

#!/bin/awk -f

{if(NR == FNR)
    {
        a[$3] = $10;
        for(i=11;i<=647;i++){
            a[$3] = a[$3] "\t" $i
        };
        next
    }
    else{
        if($3 in a){print $0 "\t" a[$3]}
    }
}

然后运行它

$ awk -f <name_of_file> file2 file1

如果有问题请告诉我

编辑:

我在第一个示例中忘记了tail -1。这适用于您提供的示例。

【讨论】:

  • 这些应该作为两个连续的命令运行还是作为一个“脚本”运行,可以这么说?我不断收到“找不到命令”,我不确定这是不是因为我将它作为一个命令运行...
  • 你在使用 bash 吗?这可能是一个错字。这是两个命令:第一个设置第一个文件中的列数,第二个执行连接...您提供的文件是真实示例?
  • 我正在使用 bash,这些是真实的示例文件。我不断收到“找不到命令”错误。唔。将调查!
  • 你能报告整个错误吗? (注意= 周围的空格会产生错误)。顺便说一句,尝试使用 awk 脚本...应该更健壮。 file2中的字段不超过12个正常吗?
【解决方案2】:

试试这个 -

文件1.txt

    #cat file1.txt
    1 715348  rs3131984   T   G   100 PASS    AC=5008;AF=1;AN=5008;NS=2504;DP=16986;EAS_AF=1;AMR_AF=1;AFR_AF=1;EUR_AF=1;SAS_AF=1;AA=.|||;VT=SNP   GT  1|1 1|1 1|1
    1 723798  rs34882115  CAG C   100 PASS    AC=4012;AF=0.801118;AN=5008;NS=2504;DP=24752;EAS_AF=0.7946;AMR_AF=0.8775;AFR_AF=0.5416;EUR_AF=0.9602;SAS_AF=0.9407;VT=INDEL GT  1|1 1|1 1|1
    1 723891  rs2977670   G   C   100 PASS    AC=3906;AF=0.779952;AN=5008;NS=2504;DP=22718;EAS_AF=0.7917;AMR_AF=0.8689;AFR_AF=0.4849;EUR_AF=0.9483;SAS_AF=0.9305;AA=.|||;VT=SNP   GT  1|1 1|1 1|1
    1 729679  rs4951859   C   G   100 PASS    AC=3205;AF=0.639976;AN=5008;NS=2504;DP=18762;EAS_AF=0.6875;AMR_AF=0.7536;AFR_AF=0.2905;EUR_AF=0.841;SAS_AF=0.7761;AA=.|||;VT=SNP    GT  1|0 1|1 1|0
    1 752566  rs3094315   G   A   100 PASS    AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.|||;VT=SNP  GT  0|1 1|1 0|1
    1 752721  rs3131972   A   G   100 PASS    AC=3272;AF=0.653355;AN=5008;NS=2504;DP=22729;EAS_AF=0.7659;AMR_AF=0.7363;AFR_AF=0.2905;EUR_AF=0.839;SAS_AF=0.7781;AA=.|||;VT=SNP    GT  0|1 1|1 0|1
    1 754182  rs3131969   A   G   100 PASS    AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16315;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
    1 754192  rs3131968   A   G   100 PASS    AC=3398;AF=0.678514;AN=5008;NS=2504;DP=16981;EAS_AF=0.7331;AMR_AF=0.7565;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
    1 754334  rs3131967   T   C   100 PASS    AC=3427;AF=0.684305;AN=5008;NS=2504;DP=21917;EAS_AF=0.7629;AMR_AF=0.755;AFR_AF=0.3525;EUR_AF=0.8718;SAS_AF=0.8088;AA=.|||;VT=SNP    GT  0|1 1|1 0|1
    1 754503  rs3115859   G   A   100 PASS    AC=3325;AF=0.663938;AN=5008;NS=2504;DP=19944;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3374;EUR_AF=0.839;SAS_AF=0.771;AA=.|||;VT=SNP GT  0|1 1|1 0|1
    1 754964  rs3131966   C   T   100 PASS    AC=3322;AF=0.663339;AN=5008;NS=2504;DP=19476;EAS_AF=0.7629;AMR_AF=0.7378;AFR_AF=0.3366;EUR_AF=0.837;SAS_AF=0.771;AA=.|||;VT=SNP GT  0|1 1|1 0|1
    1 755887  rs3131964   C   G   100 PASS    AC=4905;AF=0.979433;AN=5008;NS=2504;DP=22796;EAS_AF=1;AMR_AF=0.9914;AFR_AF=0.9304;EUR_AF=0.995;SAS_AF=1;AA=.|||;VT=SNP  GT  1|1 1|1 1|1
    1 755890  rs3115858   A   T   100 PASS    AC=3763;AF=0.751398;AN=5008;NS=2504;DP=23185;EAS_AF=0.8839;AMR_AF=0.8242;AFR_AF=0.4539;EUR_AF=0.8728;SAS_AF=0.8405;AA=.|||;VT=SNP   GT  0|1 1|1 0|1
    1 756604  rs3131962   A   G   100 PASS    AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP   GT  0|1 1|1 0|1

file2.txt

#cat file2.txt
1   742429  rs3094315   A   G   .   .   .   GT  0/0 0/0
1   1011278 rs3737728   G   A   .   .   .   GT  0/0 0/1
1   1077546 rs9442380   C   T   .   .   .   GT  0/0 0/0
1   1084601 rs4970362   G   A   .   .   .   GT  0/0 0/1
1   1089205 rs9660710   C   A   .   .   .   GT  0/0 0/0
1   1300787 rs2765033   C   T   .   .   .   GT  0/0 0/1
1   756604  rs3131962   A   G   100 PASS    AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP   GT  0|1 1|1
1   1303878 rs2649588   T   C   .   .   .   GT  0/0 0/1
1   1695996 rs6603811   C   T   .   .   .   GT  0/0 0/0
1   1782971 rs10907192  G   A   .   .   .   GT  0/0 0/0
1   1878053 rs3820011   C   A   .   .   .   GT  0/1 0/1
1   1882185 rs2803291   C   T   .   .   .   GT  0/0 0/0

加入 -

#awk 'NR==FNR {val[$3]=$10;next;} $3 in val {print $0,val[$3]}' file2.txt file1.txt
1 752566  rs3094315   G   A   100 PASS    AC=3597;AF=0.718251;AN=5008;NS=2504;DP=21293;EAS_AF=0.8839;AMR_AF=0.804;AFR_AF=0.3873;EUR_AF=0.84;SAS_AF=0.8088;AA=.|||;VT=SNP  GT  0|1 1|1 0|1 0/0
1 756604  rs3131962   A   G   100 PASS    AC=3746;AF=0.748003;AN=5008;NS=2504;DP=28270;EAS_AF=0.8829;AMR_AF=0.8242;AFR_AF=0.4501;EUR_AF=0.8698;SAS_AF=0.8323;AA=.|||;VT=SNP   GT  0|1 1|1 0|1 0|1

【讨论】:

  • @forumAdvisor - 你能解释一下为什么上面的答案被标记为否定,接受答案的输出和我的答案是一样的。
猜你喜欢
  • 2020-06-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多