Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 比较两个文件并打印匹配的字符串,上面一行,下面一行_Awk_Grep - Fatal编程技术网

Awk 比较两个文件并打印匹配的字符串,上面一行,下面一行

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

我的文件1由~100k个条目和文件2~100个条目组成。我想从File2到File1查找匹配的字符串,并打印匹配的行以及上面和下面的一行。对于较小的文件,我使用以下命令。现在我需要在一个大文件中执行,并且我希望所有3个条目都在一行中。有更好的办法吗。我没有多少经验

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