利用sed命令将基因id中的分号替换成横线

由于自己在运行以下命令时报错,后来发现是基因ID中存在分号所致(因为genome.gtf文件本身最后一行的信息就是利用分号进行分隔的)

gtftk count -i genes_all.gtf > genes_all.gtf.count

利用sed命令进行替换

#检查基因id是否存在分号
# awk -F "\t" '$NF ~ /"\S+;\S*"/' genome.gtf |less
mv genome.gtf tmp.gtf
#替换
sed 's/\( "\S*\);\(\S*"\)/\1-\2/g' tmp.gtf > genome.gtf

sed 是一个流编辑器,用于对文本进行过滤和转换。这个命令 sed 's/\( "\S*\);\(\S*"\)/\1-\2/g' 是一个 sed 命令的替换(s)操作,用于查找和替换文本。让我们逐步分析这个命令:

  1. s:表示替换操作。

  2. /\( "\S*\);\(\S*"\)/:这是替换操作的搜索模式,它使用了正则表达式和分组。

    • \( 和 \):这些是分组的开始和结束标记,它们将正则表达式的一部分分组,以便在替换模式中引用。
    • "\S*":匹配一个双引号,后面跟着任意数量的非空白字符(\S 表示非空白字符),直到遇到另一个双引号。这个模式匹配了两个这样的字符串。
    • \(\S*\):这是第二个分组,匹配任意数量的非空白字符。
  3. /\1-\2/g:这是替换模式。

    • \1 和 \2:这些是反向引用(指定打印第几个括号中的内容),分别引用了搜索模式中的两个分组。
    • -:这是要插入在两个分组之间的字符。
    • g:全局替换标志,表示替换每一行中所有匹配的文本,而不是只替换第一个匹配。

综合来看,这个 sed 命令的作用是:

  • 在每一行中查找所有符合模式 "非空白字符序列";"非空白字符序列" 的文本。
  • 将找到的文本替换为第一个分组的内容(即第一个双引号内的非空白字符序列),后面紧跟一个短横线 -,然后是第二个分组的内容(即第二个双引号内的非空白字符序列)。

例如,如果输入文本是:

"value1";"value2"
"another1";"another2"

使用这个 sed 命令后,输出将是:

复制

value1-value2
another1-another2

这个命令在处理具有特定格式的文本时非常有用,比如在处理CSV(逗号分隔值)文件时,你可能需要将某些字段合并,并用短横线连接。

猜你喜欢

转载自blog.csdn.net/hgz2020/article/details/143467332