Awk 比较两个文件并打印匹配的字符串,上面一行,下面一行
我的文件1由~100k个条目和文件2~100个条目组成。我想从File2到File1查找匹配的字符串,并打印匹配的行以及上面和下面的一行。对于较小的文件,我使用以下命令。现在我需要在一个大文件中执行,并且我希望所有3个条目都在一行中。有更好的办法吗。我没有多少经验Awk 比较两个文件并打印匹配的字符串,上面一行,下面一行,awk,grep,Awk,Grep,我的文件1由~100k个条目和文件2~100个条目组成。我想从File2到File1查找匹配的字符串,并打印匹配的行以及上面和下面的一行。对于较小的文件,我使用以下命令。现在我需要在一个大文件中执行,并且我希望所有3个条目都在一行中。有更好的办法吗。我没有多少经验 awk '{split($1, a, ":"); split(a[2], b, "-"); print b[1]" "b[2]}' File2.txt grep -E &qu
awk '{split($1, a, ":"); split(a[2], b, "-"); print b[1]" "b[2]}' File2.txt
grep -E "6263604 6263708|130370901 130370975" File1.txt -C 1
文件1
文件2
预期产量
10 . 6263344 6263490 6263604 6263708 6264818 6264947
6 . 130370427 130376400 130370901 130370975 130372394 130372488
假设数字是唯一的,因此没有与示例脚本中相同的前缀匹配
$ cat tst.awk
BEGIN { FS="[ .:-]+" }
{ curr = $2 " " $3 }
NR == FNR {
a[$1 " . " curr]
next
}
buf!="" { print buf, curr; buf="" }
$0 in a { buf=$1 " . " prev OFS curr }
{ prev = curr }
END { if (buf!="") print buf }
假设数字是唯一的,因此没有与示例脚本中相同的前缀匹配
$ cat tst.awk
BEGIN { FS="[ .:-]+" }
{ curr = $2 " " $3 }
NR == FNR {
a[$1 " . " curr]
next
}
buf!="" { print buf, curr; buf="" }
$0 in a { buf=$1 " . " prev OFS curr }
{ prev = curr }
END { if (buf!="") print buf }
要与问题交换文件编号保持一致,例如
file2 FS=”“file1
(完成得很好)要与问题交换文件编号保持一致,例如file2 FS=”“file1
(完成得很好)我注意到在您的代码中,您的匹配条件中没有包含10
和6
,仅限范围,如6263604 6263708
-当多个第一个值或文件2中不存在的第一个值存在相同范围时,预期行为是什么,例如,如果5。6263604 6263708
存在于文件1中,但10 6263604 6263708
没有,如果文件1中的5..
行被视为与文件2中的10:…
行匹配,是否打印?@EdMorton在这个数据集中,我用awk'{split($1,a,“:”);split(a[2],b,“-”);print b[1]“b[2]}”文件2.txt;awk'fner==NR==NR{a[$1$2]=1;下一个}a[$3$4]{打印$3$4}“-File1.txt | sort | uniq-d,没有发现这种情况,但有可能。我的File1是人类基因区域,file2是药物靶区;因此你服用的情况可能适用于其他一些药物。我正在尝试对药物靶点的上游/下游进行基因改造,看看它将如何影响药物相互作用除此之外,您不能通过连接两个字符串来创建唯一值,因为a bc
和ab c
在连接时都变成abc
。因此a[$1$2]
和a[$3$4]
是错误的,它们应该是a[$1,$2]
和a[$3,$4]
或类似内容。@EdMorton感谢您的分享。我通常都使用这两种方式。老实说,我没有意识到这两种方式的区别。再次感谢您。我注意到您的代码中没有将10
和6
包含在匹配条件中,只有6263604 6263708
这样的范围-当相同的r对于多个第一个值或文件2中不存在的第一个值,存在范围,例如,如果文件1中存在5.6263604 6263708
,但10 6263604 6263708
没有,那么文件1中的5..
行是否应被视为与文件2中的10:…
行匹配,并按此数据集中的@EdMorton使用awk'{split($1,a,“:”);split(a[2],b,“-”);print b[1]“b[2]}”File2.txt | awk'FNR==NR{a[$1$2]=1;next}a[$3$4]{print$3,$4}“-File1.txt | sort | uniq-d,没有发现这种情况,但有可能。我的File1是人类基因区域,file2是药物靶区;因此你服用的情况可能适用于其他一些药物。我正在尝试对药物靶点的上游/下游进行基因改造,看看它将如何影响药物相互作用除此之外,您不能通过连接两个字符串来创建唯一值,因为a bc
和ab c
在连接时都变成abc
。因此a[$1$2]
和a[$3$4]
是错误的,它们应该是a[$1,$2]
和a[$3,$4]
或类似内容。@EdMorton感谢您的分享。我通常都使用这两种方式。老实说,我没有意识到这两种方式的区别。再次感谢您。这看起来更好,前缀不匹配困扰了我。这看起来更好,前缀不匹配困扰了我。
$ awk 'NR==FNR {a[$2" "$3]; next}
m {print $1,$2,pp,p,$3,$4; m=""}
$3 FS $4 in a {m=1}
{pp=p; p=$3 FS $4}
END {if(m) print $1,$2,pp,p}' FS='[:-]' file2 FS=' ' file1
10 . 6263344 6263490 6263604 6263708 6264818 6264947
6 . 130370427 130376400 130370901 130370975 130372394 130372488
$ cat tst.awk
BEGIN { FS="[ .:-]+" }
{ curr = $2 " " $3 }
NR == FNR {
a[$1 " . " curr]
next
}
buf!="" { print buf, curr; buf="" }
$0 in a { buf=$1 " . " prev OFS curr }
{ prev = curr }
END { if (buf!="") print buf }
$ awk -f tst.awk file2 file1
10 . 6263344 6263490 6263604 6263708 6264818 6264947
6 . 130370427 130376400 130370901 130370975 130372394 130372488