Bash脚本Unix。模式匹配

时间:2018-10-29 19:44:09

标签: linux bash shell unix

如何在一行中没有空格的情况下为多个字符串编写脚本:

acgtttgggcccagctctccgccctcacacacaccccggggt

出于视觉目的:

acg ttt ggg ccc agc tct ccg ccc tca cac aca ccc cgg ggt

,并且必须将第4个3个字母的序列匹配两次。因此,在上述序列中,我们将ccc作为第四个序列。并在agc tct ccg之后再次重复。

所以我必须使用grep吗?

1 个答案:

答案 0 :(得分:1)

那又如何:

#!/bin/bash

# add a space every three letters
str="acgtttgggcccagctctccgccctcacacacaccccggggt"
result=$(sed -e 's/\(...\)/\1 /g' <<< "$str")
echo $result

# check if the 4th sequence is repeated two times
awk '
{   ref = $4;                       # set the 4th sequence as a reference
    for (i=5; i<=NF; i++)           # iterate from 5th sequence to the end
        if (ref == $i) count++      # count the same one as the reference
    printf "4th sequence \"%s\" repeated %d times.\n", ref, count
}' <<< "$result"

产生:

acg ttt ggg ccc agc tct ccg ccc tca cac aca ccc cgg ggt
4th sequence "ccc" repeated 2 times.  

该脚本由两部分组成:第一部分用空格分割字符串,第二部分计算第四个三元组的重复次数。

  • sed脚本sed -e 's/\(...\)/\1 /g'每隔三个字母插入一个空格。
  • awk脚本遍历与第四个三元组相同的序列。
  • 如果您只想确保重复准确地是两次次,则可以修改脚本以将count与2进行比较。

希望这会有所帮助。