我怎样才能比较3个文件(看看他们之间有什么共同点)?

我想比较3个文件,看看文件中有多less信息是相同的。 文件格式是这样的:

Chr11 447 . AC 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 . GC 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 . GA 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 . GA 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个文件!

Solutions Collecting From Web of "我怎样才能比较3个文件(看看他们之间有什么共同点)?"

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

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

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

以下是它的作用:

  1. 打印并排序所有文件的前两列( awk '{print $1" "$2}' abc | sort
  2. 统计重复条目的数量( uniq -c
  3. 如果重复的条目数==文件的数量,我们找到了一个匹配。 打印它。

如果你经常这样做,你可以把它表示为一个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

为此,我会使用命令cutsortcomm

  1. 随着切割不需要的领域。

  2. 排序结果,因为comm预计分类输入。

  3. 使用comm来获取文件1和文件2中的行。

  4. 再次使用comm来获取也在file3中的行。

一个脚本可能看起来像这样:

  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您现在应该在所有三个文件中都有键。 如果您对整个行感兴趣,可以使用命令连接和任何输入文件的排序版本)

刚刚阅读你最后的评论 – 你想要的文件加入,但重复删除?

  sort file1 file2 file3 | uniq > newfile 

不打算开始编辑之战,但我熟悉VI,vimdiff及其变体显示在并行视图中的多个文件之间的比较,我发现非常方便。 只要你可以打电话给它

 $ vimdiff <filelist>