以下是awk命令的组合
awk '
{if ($0~/>/) {head=$0;getline}
{if($0~/pattern/) print head"\n"$0}}' filename1 |
awk
'BEGIN {pos=0;char=0}
{if($0~/>/) head=$0;getline}
{pos=0;
if($0~/pattern/)
{pos=match($0,/pattern/);char=substr($0,pos,55)}
print head"\n"char}'
上面一个很好用,我想在识别出“AATTGGCC”模式后捕获55个字符。问题是如何在匹配模式中获得55个字符前缀(匹配模式前55个字)。 是的,我可以在perl中编写全部内容,但由于我在awk中有上述内容,我想知道是否可以以某种方式修改它。
由于
答案 0 :(得分:0)
这有点暴力,但你可以使用在AATTGGCC之前有55个周期的模式
例如:
/.......................................................AATTGGCC/ {print substr(%$0,1,55)}
应该做的伎俩。最好看看awk正则表达式是否支持子表达式。
但最好的方法是使用Python和library like pygep,因为Python在生物信息学中被大量使用。
答案 1 :(得分:0)
这是一个打印模式之前的一些字符的方法的演示:
echo 'abcdefghijklmnopqrstuvwxyz' |
awk 'BEGIN {pat = "jkl"; n = 5}
pat {
i = index($0,pat);
print substr($0, i-n, n + length(pat))
}'
输出(“jkl”和“jkl”之前的五个字符):
efghijkl
如果您的数据有换行符,并且要输出的字符序列跨越换行符,则需要累积行,删除换行符并在缓冲区变量中保留足够的字符,以便输出它们。
对于它的价值,这里是你的脚本的简化版本。它可能无法正常运行,但它更具可读性和更多AWKish。我没有做任何事情试图让它执行你所需要的功能,也没有测试过它。
awk '
/>/ {head = $0; getline}
/pattern/ print head "\n" $0
' filename1 |
awk '
BEGIN {pos = 0; char = 0}
/>/) {head = $0; getline}
{
pos = 0;
if ($0 ~ /pattern/) {
pos = match($0, /pattern/); char = substr($0, pos, 55)
}
print head "\n" char
}'
答案 2 :(得分:0)
没有一些样本输入,很难测试,但我相信你的非常像C的awk可以简化为:
awk -v pattern="abcd_or_whatever" -v n=55'
/>/ {head=$0; next}
pos = match($0, pattern) {print head "\n" substr($0, pos, n)}
'
要在比赛前获得55个字符,您只需将substr参数更改为substr($0, pos-n, n)
答案 3 :(得分:0)
感谢大家的建议。 关于awk代码的格式,我没有用正确的脚本或任何东西执行它。这一切都在命令行中,因此产生了很多“管道”。但我确实理解并会在寻求帮助时尝试以适当的格式编写代码。
我发现awk中的RSTART是一个跟踪匹配模式的变量,因此我可以按如下方式使用它(这只是实际命令的一部分)。
awk 'BEGIN{pos=0;char=0}{if($0~/>/) head=$0;getline} {pos=0;if($0~/pattern/) {match($0,/pattern/);char=substr($0,RSTART-47,47)}print head"\n"char}'.
这可以从匹配模式返回47个字符并打印出来。