awk搜索存储在file2中的file1中的正则表达式

时间:2015-10-13 10:35:54

标签: regex file search awk

我有以下问题:

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

File1看起来像:

header1
header5
header17
header1076
...

包含以下格式的数据的file2:

>header
XXXX
>header2
XXXX
XXXX
XXX
>header3
X

所以我想要一个名为header2的文件,其中包含信息

>header2
XXXX
XXXX
XXX

如果file1中存在header2。

现在我想在file1中存在标题时将file2的条目提取为单独的文件名,如标题。我有一个用于提取条目的功能awk脚本,但我必须手动指定正则表达式+文件名:

awk '/header1/{p=1;print $0;next} /^>/{p=0} p{print}' file2 > ~/Desktop/single_scaffolds/header1

我知道我可能只是通过一些bash-code或类似的方法使用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不太熟练,所以欢迎任何帮助:)

编辑:我有一个额外的想法是,只需通过file2解析一次就可以一次性提取它们,所以我不必多次搜索文件(file2可能是千兆字节,我可能想要提取条目在数百),但后来我真的不知道该怎么做;)

EDIT2:我实际上不确定我的1mio行文件中的每一行是否更快,如果它匹配我的一百个标题之一(如1mio *最多100个查找)或通过文件搜索100次在找到他之后获得1个标题并退出(例如100 *最大1十分比较)

1 个答案:

答案 0 :(得分:0)

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

这样,查找将是哈希映射搜索,恒定时间,比循环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