如何用AWK处理基因数据:移除gene行并将exon替换为gene-X格式
按基因组分组替换exon为gene-X的AWK解决方案
输入文件(test.txt)
gene 1:362273700-362275735 exon 1:362275166-362275246 exon 1:362274811-362275058 exon 1:362274230-362274685 gene 1:362279796-362287281 exon 1:362279796-362280179 exon 1:362280576-362280662 exon 1:362280858-362280958 exon 1:362281056-362281106
预期输出
gene-1 1:362275166-362275246 gene-1 1:362274811-362275058 gene-1 1:362274230-362274685 gene-2 1:362279796-362280179 gene-2 1:362280576-362280662 gene-2 1:362280858-362280958 gene-2 1:362281056-362281106
需求说明
- 过滤掉所有以
gene开头的行 - 将每个
exon行替换为gene-X格式,X从1开始递增,且同一个gene对应的后续所有exon使用相同的X值
尝试过的错误命令及结果
命令1
awk '$1~/exon/ {print $0 (/^exon/ ? "-" (++c) : "")}' test.txt
输出:
exon 1:362275166-362275246-1 exon 1:362274811-362275058-2 exon 1:362274230-362274685-3 exon 1:362279796-362280179-4 exon 1:362280576-362280662-5 exon 1:362280858-362280958-6 exon 1:362281056-362281106-7
命令2
awk '$1~/exon/ {$1=$1 "-" (++count[$1])}1' test.txt
输出:
gene 1:362273700-362275735 exon-1 1:362275166-362275246 exon-2 1:362274811-362275058 exon-3 1:362274230-362274685 gene 1:362279796-362287281 exon-4 1:362279796-362280179 exon-5 1:362280576-362280662 exon-6 1:362280858-362280958 exon-7 1:362281056-362281106
正确的AWK命令
/^gene/ {gene_num++; next} /^exon/ {print "gene-" gene_num, $2}
命令逻辑解释
- 当匹配到以
gene开头的行时:- 递增
gene_num计数器(初始默认0,第一次匹配后变为1) - 执行
next跳过当前行,不输出任何内容
- 递增
- 当匹配到以
exon开头的行时:- 输出固定前缀
gene-加上当前的gene_num,再拼接第二列的位置信息
- 输出固定前缀
- 未匹配上述两种模式的行会被自动忽略
运行该命令后即可得到预期的输出结果。
内容的提问来源于stack exchange,提问作者pedro
相关产品推荐
相关产品推荐

