awk查找并输出文件中的差异

时间:2015-10-07 15:40:37

标签: awk

我正在尝试找出file1.txtfile2.txt之间的差异并输出差异。我尝试了diffsed,输出没有返回任何差异。我也尝试awk并在$2上进行匹配,但我认为语法错误,因为文件已创建,但它是0kb。我使用的实际数据非常大,但我知道应该有18个不同之处。谢谢你:)。

awk 'NR==FNR{a[$2]++;next} !($2 in a){print $2}' file1.txt file2.txt > diff.txt

FILE1.TXT

chr1    955542  955763
chr1    957570  957852
chr1    976034  976270

FILE2.TXT

chr1    955542  955763  +   AGRN:exon.1
chr1    957570  957852  +   AGRN:exon.2
chr1    976034  976270  +   AGRN:exon.2;AGRN:exon.3;AGRN:exon.4
chr1    976542  976787  +   AGRN:exon.3;AGRN:exon.5
chr1    976847  977092  +   AGRN:exon.6

所需的输出

chr1    976542  976787  +   AGRN:exon.3;AGRN:exon.5
chr1    976847  977092  +   AGRN:exon.6

差异结果(因为这些是两个文件中都没有的两条记录)

1,52058c1,52040
< chr1  955542  955763
< chr1  957570  957852
< chr1  976034  976270

2 个答案:

答案 0 :(得分:4)

我很好奇,虽然差异不是你想要的,但你的awk逻辑是不正确的:

您只需检查第二个字段(以空格分隔)值。在您的示例中,第二个字段全部相同,因此不打印任何内容。使用整行代替按预期工作:

使用所有不同的示例文本:

$ cat file1.txt
chr1 955542 955763
chr1 957570 957852
chr1 976034 976270

$ cat file2.txt
chr1 955542 955763 + AGRN:exon.1
chr1 957570 957852 + AGRN:exon.2
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

$ awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1.txt file2.txt > diff.txt

$ cat diff.txt
chr1 955542 955763 + AGRN:exon.1
chr1 957570 957852 + AGRN:exon.2
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

这里的第二行相同只是为了表明它以更明显的方式工作。

$ cat file1.txt
chr1  955542 955763
chr1  957570 957852
chr1  976034 976270

$ cat file2.txt
chr1 955542 955763 + AGRN:exon.1
chr1 957570 957852
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

$ awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1.txt file2.txt > diff.txt

$ cat diff.txt
chr1 955542 955763 + AGRN:exon.1
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

修改

根据评论说明: &#34; 52,000行中应该有18个差异。 File1.txt是52,058个条目,file2.txt中有52,040个条目。我试图找出18是什么&#34;

鉴于你说file1有更多行,你需要先处理file2。第一个文件读取填充数组,然后第二个文件检查该数组中存在的行。您需要先处理较小的文件,以便您感兴趣的其他行不在数组中。它与上面的逻辑相同,只是切换了文件顺序,例如:

$ cat file1.txt
chr1 955542 955763
chr1 957570 957852
chr1 976034 976270
New Line!
Not in file2!

$ cat file2.txt
chr1 955542 955763 + AGRN:exon.1
chr1 957570 957852
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

$ awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file2.txt file1.txt > diff.txt

$ cat diff.txt
chr1 955542 955763
chr1 976034 976270
New Line!
Not in file2!

$ awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1.txt file2.txt > diff.txt

$ cat diff.txt
chr1 955542 955763 + AGRN:exon.1
chr1 976034 976270 + AGRN:exon.2;AGRN:exon.3;AGRN:exon.4

请注意,首先读取file1不会发出额外的行。

如果你不在乎线上的其他文字,只关心第二个字段中的文字,那么你可以像原来那样使用2美元。

答案 1 :(得分:2)

$ awk 'NR==FNR{a[$2];next} !($2 in a)' file1 file2
chr1    976542  976787  +   AGRN:exon.3;AGRN:exon.5
chr1    976847  977092  +   AGRN:exon.6