如何将3个文件进行比较(以查看它们之间的共同点)?

时间:2011-11-01 09:51:52

标签: linux comparison awk wc

我想将3个文件进行比较,以查看文件中有多少信息是相同的。文件格式如下:

Chr11   447     .       A       C       74      .       DP=22;AF1=1;CI95=1,1;DP4=0,0,9,8;MQ=15;FQ=-78   GT:PL:GQ        1/1:107,51,0:99
Chr10   449     .       G       C       35      .       DP=26;AF1=0.5;CI95=0.5,0.5;DP4=5,0,7,8;MQ=20;FQ=11.3;PV4=0.055,0.0083,0.028,1   GT:PL:GQ        0/1:65,0,38:41
Chr12   517     .       G       A       222     .       DP=122;AF1=1;CI95=1,1;DP4=0,0,77,40;MQ=23;FQ=-282       GT:PL:GQ        1/1:255,255,0:99
Chr10   761     .       G       A       41      .       DP=93;AF1=0.5;CI95=0.5,0.5;DP4=11,34,6,35;MQ=19;FQ=44;PV4=0.29,1.8e-35,1,1      GT:PL:GQ        0/1:71,0,116:74

我只对前两列感兴趣(如果前两列是相同的,那么我认为它是相同的)。这是我用来比较两个文件的命令:

awk 'FILENAME==ARGV[1] {pair[$1 " " $2]; next} ($1 " " $2 in pair)'  file1 file2 | wc -l

我想使用awk命令,因为我的文件非常大而awk处理它们非常好!但我无法弄清楚如何将它用于3个文件!

4 个答案:

答案 0 :(得分:2)

为此,我将使用命令 cut sort comm

  1. cut 删除不需要的字段。

  2. 排序结果,因为 comm 期望排序输入。

  3. 使用 comm 获取file1和file2中的行。

  4. 再次使用 comm 获取同样位于file3中的行。

  5. 脚本可能如下所示:

     for i in 1 2 3
      do
       # options to cut may have to be adjusted for your input files
       cut -c1-15 file$i | sort > tmp.$i
      done
    
     comm -12 tmp.1 tmp.2   > tmp.1+2
     comm -12 tmp.3 tmp.1+2 > tmp.1+2+3
    

    (当然可以使用扩展shell语法来避免临时文件,但我不想隐藏复杂语法表达式背后的想法)

    在文件tmp.1+2+3中,您现在应该在所有三个文件中都有密钥。如果您对整行感兴趣,可以将 join 命令与任何输入文件的排序版本结合使用)

答案 1 :(得分:2)

只需阅读您的上一条评论 - 您希望文件已加入,但重复项已删除?

 sort file1 file2 file3 | uniq > newfile

答案 2 :(得分:2)

如果只是打印出所有3个文件中常见的对(column1 + column2),并利用一对在文件中唯一的事实,你可以这样做:

awk '{print $1" "$2}' a b c | sort | uniq -c | awk '{if ($1==3){print $2" "$3}}'

只要修改最后一个命令的参数,就可以使用任意数量的文件。

以下是它的作用:

  1. 打印并排序所有文件的前2列(awk '{print $1" "$2}' a b c | sort
  2. 计算重复条目的数量(uniq -c
  3. 如果重复输入计数==文件数,我们找到了匹配项。打印它。
  4. 如果您经常这样做,可以将其表达为bash函数(并将其放在.bashrc中),以便对文件计数进行参数化。

    function common_pairs { 
        awk '{print $1" "$2}' $@ | sort | uniq -c | awk -v numf=$# '{if ($1==numf){print $2" "$3}}'; 
    }
    

    使用您想要的任意数量的文件调用它:common_pairs file1 file2 file3 fileN

答案 3 :(得分:2)

不打算开始编辑器大战,但我熟悉VI,vimdiff及其变体显示并行视图中多个文件之间的比较,我觉得非常方便。您只需使用

进行调用即可
$ vimdiff <filelist>