我正在尝试找出file1.txt
和file2.txt
之间的差异并输出差异。我尝试了diff
和sed
,输出没有返回任何差异。我也尝试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
答案 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