模式匹配Bash中存储的变量或正则表达式

时间:2015-11-06 08:55:33

标签: regex bash variables pattern-matching

由于我是一位生物学家并通过修补和编辑这样的代码形式论坛来做我的信息学,所以我提前为新手的错误道歉。

当这个模式是File1中的第一行时,我一直在尝试迭代File2中的文件和搜索模式。我的目标是在模式之后将一行附加到outFile。

我的第一次尝试是插入这样的正则表达式:

awk 'c&&!--c;/"${head -1 "$File1"}"/{c=1}' "$File2" >> outFile

第二个将模式存储到变量中:

pattern=$(head -1 "$File1")
awk 'c&&!--c;/"$pattern"/{c=1}' "$File2" >> outFile

(File1和File2标有" $"因为我用for循环调用它们。)

但两者都不起作用。如果我直接写模式它可以正常工作,所以其他一切似乎没问题。

所以我处理序列数据,并且在爆破之后我将命中列表放到File1中,看起来像这样:

BLAST_hit_Jerry
BLAST_hit_Tom
BLAST_hit_Dog
...

现在杰瑞是最好的。我想提取第一行(BLAST命中Jerry)并在序列文件(File2)中匹配模式,看起来像:

>BLAST_hit_BugsBunny_andsomethingelse
unique_sequence_BugsBunny
>BLAST_hit_MickyMouse_andsomethingelse
unique_sequence_MickyMouse
>BLAST_hit_Jerry_andsomethingelse
unique_sequence_Jerry
...

我有很多File1 BLAST命中文件和相应的File2序列文件,我迭代并始终​​只存储一个与顶部BLAST命中对应的unique_sequence。 outFile看起来像:

unique_sequence_Jerry
unique_sequence_from_second_loop_(other sequence corresponding to next top BLAST hit)
unique_sequence ...

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

$pattern未在单引号内展开。将值作为awk变量传递,然后使用~运算符匹配该值。

awk -v p="$pattern" 'c&&!--c; $0 ~ p {c=1}' "$File2" >> outFile