Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Regex Awk搜索文件2中文件1中存储的正则表达式_Regex_File_Search_Awk - Fatal编程技术网

Regex Awk搜索文件2中文件1中存储的正则表达式

Regex Awk搜索文件2中文件1中存储的正则表达式,regex,file,search,awk,Regex,File,Search,Awk,我有以下问题: 我有两个文件。文件1包含文件2中搜索的起始字符串(标题) 文件1看起来像: header1 header5 header17 header1076 ... 和文件2,其中包含以下格式的数据: >header XXXX >header2 XXXX XXXX XXX >header3 X 所以我想要一个名为header2的文件 >header2 XXXX XXXX XXX 如果文件1中存在header2 现在,我想将file2的条目提取到一个单独的文件名

我有以下问题:

我有两个文件。文件1包含文件2中搜索的起始字符串(标题)

文件1看起来像:

header1
header5
header17
header1076
...
和文件2,其中包含以下格式的数据:

>header
XXXX
>header2
XXXX
XXXX
XXX
>header3
X
所以我想要一个名为header2的文件

>header2
XXXX
XXXX
XXX
如果文件1中存在header2

现在,我想将file2的条目提取到一个单独的文件名中,就像在file1中存在头时的头一样。我有一个用于提取条目的有效awk脚本,但我必须手动指定regex+文件名:

awk '/header1/{p=1;print $0;next} /^>/{p=0} p{print}' file2 > ~/Desktop/single_scaffolds/header1
我知道我可能只需要通过一些bash代码或类似代码从file1中调用提取脚本,但我认为完全可以在awk中解决它

到目前为止,我试过:

awk ' 
FNR==NR {  
    scafArray[$0] = $0
}
for (entry in scafArray){

/entry/{p=1;print $0;next} /^>/{p=0} p{print > "~/Desktop/single_scaffolds/adjacent_sequence/"entry};
exit;

}' file1 file2
但我总是出错。我不是很精通awk,所以欢迎任何帮助:)

编辑:我还有一个想法,就是在一次通过文件2解析一次时,一次将它们全部提取出来,这样我就不必在文件中搜索多次(文件2可能是千兆字节大的,我可能想提取数百个条目),但我真的不知道怎么做;)


EDIT2:我实际上不确定查找1mio行文件中的每一行是否与我的100个标题中的一个匹配(如1mio*最多查找100次)或在文件中搜索100次以查找1个标题并在找到他后退出(如100*最多查找1mio比较)

如果您的文件与示例中的一样,您可以从文件1加载数组,以便索引与文件2中应触发输出的行完全匹配

这样,查找将是哈希映射搜索,时间不变,比循环100个可能匹配的内容(或100次传递文件)更有效,因此希望性能不会太差:

编辑:基于标题名打印到文件的版本:

NR==FNR { a[">" $0]; next }
$0 in a {fn = substr($0, 2); p = 1; print > fn; next}
/^>/ {p = 0}
p { print > fn }
原始答复:

$ cat asr.awk
NR==FNR { a[">" $0]; next }
$0 in a {p = 1; print $0; next}
/^>/ {p = 0}
p

$ cat file1
header2
header5
header17
header1076

$ cat file2
>header1
X1
>header2
XXXX2
XXXX2
XXX2
>header3
X3
XXXX3
>header5
aaa
aaaa
a
>header18
bbb
bbbb
bb

$ awk -f asr.awk file1 file2
>header2
XXXX2
XXXX2
XXX2
>header5
aaa
aaaa
a

您能说明文件1的确切结构吗?文件1中的头是唯一的吗?哇,这看起来比我想象的要简单得多。现在,如果我想将输出存储在一个名为像header一样的文件中,我假设我可以在print$0之后添加一些内容?像{p=1;filename=/path/to/file/$0;print$0>filename;next}和在p{print$0>>filename}结尾处,请参见编辑。(请注意,我从文件名前面删除了
。严格来说没有必要这样做,但除非有某种要求,否则没有它,生活可能会更简单。;)还要注意,
print$0
print
是等效的。最后,在同一个awk运行中,通常只需要使用单个
重定向输出。第一个将(重新)创建一个空文件,其余的将全部追加。如果要将调用awk之前的文件追加到文件中,则只需
>
。无需担心我会变慢;),谢谢你的回答。第二次打印不应该使用>>吗?这样它就不会覆盖第一次打印时文件中的标题行?请参阅此处,以获得有关
>
的更好解释: