我有以下问题:
我有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十分比较)
答案 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