3

我想将 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

4 回答 4

3

为此,我将使用命令cutsortcomm

  1. 切掉不需要的字段。

  2. 对结果进行排序,因为comm需要排序的输入。

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

  4. 再次使用comm来获取文件 3 中的行。

脚本可能如下所示:

 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与任何输入文件的排序版本结合使用)

于 2011-11-01T10:15:12.417 回答
3

只需阅读您的最后一条评论 - 您想要加入文件,但删除重复项?

 sort file1 file2 file3 | uniq > newfile
于 2011-11-01T10:20:25.300 回答
3

如果只是打印出所有 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. 如果重复条目计数 == 文件数,我们找到了匹配项。打印它。

如果您经常这样做,您可以将其表示为一个 bash 函数(并将其放在您的 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

于 2011-11-01T10:35:17.503 回答
3

不打算发起编辑大战,但我对VI很熟悉,vimdiff及其变体以并行视图显示多个文件之间的比较,我觉得这很方便。你可以简单地调用它

$ vimdiff <filelist>
于 2014-02-06T05:40:45.497 回答