我想将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个文件!
答案 0 :(得分:2)
为此,我将使用命令 cut , sort 和 comm 。
用 cut 删除不需要的字段。
排序结果,因为 comm 期望排序输入。
使用 comm 获取file1和file2中的行。
再次使用 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
中,您现在应该在所有三个文件中都有密钥。如果您对整行感兴趣,可以将 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}}'
只要修改最后一个命令的参数,就可以使用任意数量的文件。
以下是它的作用:
awk '{print $1" "$2}' a b c | sort
)uniq -c
)如果您经常这样做,可以将其表达为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>