linux - Bash 脚本 Unix。模式匹配

标签 linux bash shell unix

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

acgtttgggcccagctctccgccctcacacacaccccggggt

用于视觉目的:

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

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

那么我必须使用 grep 吗?

最佳答案

那么怎么样:

#!/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 进行比较。

希望这有帮助。

关于linux - Bash 脚本 Unix。模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53052705/

相关文章:

bash - sed - 循环仅替换出现中的最后一种语言 - 它应该替换所有

bash - 下载直播流时,如何使 youtube-dl 或 streamlink 在一段时间后停止

shell - 为什么在批处理程序的 FOR 循环中创建了一个额外的文件?

python - 如何将值附加到 bash shell 脚本中的空数组?

php - 动态 CSS(带有 php header )无法在 Linux 中呈现(mint)——它在 Windows 中运行良好

linux - NFS 在客户端上显示安全上下文 "?"/"blank"?

linux - 为什么 `ls` 每行列出多个文件,而 `ls pipe/redirect` 每行只列出 1 个文件?

linux - 如何将 Yocto 生成的镜像放在硬盘驱动器上并启动它?

linux - 冒号(:) and dash (-) in an Ubuntu dpkg version number mean?

bash - 如何使用 Bash 检查文件是否包含特定字符串