由于自己在运行以下命令时报错,后来发现是基因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)操作,用于查找和替换文本。让我们逐步分析这个命令:
-
s
:表示替换操作。 -
/\( "\S*\);\(\S*"\)/
:这是替换操作的搜索模式,它使用了正则表达式和分组。\(
和\)
:这些是分组的开始和结束标记,它们将正则表达式的一部分分组,以便在替换模式中引用。"\S*"
:匹配一个双引号,后面跟着任意数量的非空白字符(\S
表示非空白字符),直到遇到另一个双引号。这个模式匹配了两个这样的字符串。\(\S*\)
:这是第二个分组,匹配任意数量的非空白字符。
-
/\1-\2/g
:这是替换模式。\1
和\2
:这些是反向引用(指定打印第几个括号中的内容),分别引用了搜索模式中的两个分组。-
:这是要插入在两个分组之间的字符。g
:全局替换标志,表示替换每一行中所有匹配的文本,而不是只替换第一个匹配。
综合来看,这个 sed
命令的作用是:
- 在每一行中查找所有符合模式
"非空白字符序列";"非空白字符序列"
的文本。 - 将找到的文本替换为第一个分组的内容(即第一个双引号内的非空白字符序列),后面紧跟一个短横线
-
,然后是第二个分组的内容(即第二个双引号内的非空白字符序列)。
例如,如果输入文本是:
"value1";"value2"
"another1";"another2"
使用这个 sed
命令后,输出将是:
复制
value1-value2
another1-another2
这个命令在处理具有特定格式的文本时非常有用,比如在处理CSV(逗号分隔值)文件时,你可能需要将某些字段合并,并用短横线连接。