awk查找并输出文件中的差异
我试图找出awk查找并输出文件中的差异,awk,Awk,我试图找出file1.txt和file2.txt之间的差异,并输出这些差异。我尝试了diff和sed,输出没有返回任何差异。我还尝试了awk和$2上的匹配,但我认为在创建文件时语法是错误的,但它是0kb。我使用的实际数据相当大,但我知道应该有18个差异。谢谢:) file1.txt chr1 955542 955763 chr1 957570 957852 chr1 976034 976270 chr1 955542 955763 + AGRN:exon.
file1.txt
和file2.txt
之间的差异,并输出这些差异。我尝试了diff
和sed
,输出没有返回任何差异。我还尝试了awk
和$2
上的匹配,但我认为在创建文件时语法是错误的,但它是0kb。我使用的实际数据相当大,但我知道应该有18个差异。谢谢:)
file1.txt
chr1 955542 955763
chr1 957570 957852
chr1 976034 976270
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
file2.txt
chr1 955542 955763
chr1 957570 957852
chr1 976034 976270
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
所需输出
chr1 955542 955763
chr1 957570 957852
chr1 976034 976270
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
Diff result(因为这两条记录不在两个文件中)
152058C152040
我很好奇,虽然diff没有按照您想要的方式工作,但您的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
编辑
根据以下评论:
“52000行中应该有18个差异。File1.txt是52058个条目,file2.txt中有52040个条目。我正在尝试找出这18个差异是什么”
如果您说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。我很好奇,diff的工作方式不符合您的要求,但您的awk逻辑不正确:
$ 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
您只检查第二个字段(由空格分隔)的值。在您的示例中,第二个字段完全相同,因此没有打印任何内容。相反,使用整条线路可以按预期工作:
使用所有内容都不同的示例文本:
$ 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
编辑
根据以下评论:
“52000行中应该有18个差异。File1.txt是52058个条目,file2.txt中有52040个条目。我正在尝试找出这18个差异是什么”
如果您说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。为什么
diff file1.txt file2.txt
不起作用?我尝试过了,返回的结果是文件中的所有内容,而不是差异。谢谢:)。你期望有什么不同?根据您正在检查的第二个字段的脚本,因为它们是匹配的,所以不需要任何差异。@Chris-不,我们不是在询问看不到的文件之间的差异。我们正在询问您发布的我们可以看到的文件与这些文件的预期输出之间的区别。这就是我们所要做的,也是我们将要测试的潜在解决方案。如果这些文件不代表您的真实输入并演示问题,那么请编辑您的问题以解决问题。我认为这有一点,但现在您只需更改!(a中的$2){打印$2}
到!(a中的$2){print$0}
(习惯用法为!(a中的$2)
)你最初发布的脚本可以工作,我相信如果这真的是你的问题,你会很清楚,所以我想一定还有其他事情发生,到目前为止你还无法沟通。为什么diff file1.txt file2.txt
不能工作?我试过了,返回的结果是不要将差异归档。谢谢:)。你期望有什么不同?根据您正在检查的第二个字段的脚本,因为它们是匹配的,所以不需要任何差异。@Chris-不,我们不是在询问看不到的文件之间的差异。我们正在询问您发布的我们可以看到的文件与这些文件的预期输出之间的区别。这就是我们所要做的,也是我们将要测试的潜在解决方案。如果这些文件不代表您的真实输入并演示问题,那么请编辑您的问题以解决问题。我认为这有一点,但现在您只需更改!(a中的$2){打印$2}
到!($2在a){print$0}
(习惯用法就是!($2在a)
)和您最初发布的脚本都可以工作,我相信如果这真的是您的问题的话,这对您来说是显而易见的,所以我想一定还有其他事情发生,到目前为止您还无法沟通。
$ 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