我想通过只取最后一列的一个特定部分来修改文件(gff3格式)!
我的文件看起来像这样,九个列由制表符空格分隔:
NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 ID = cds20267; Parent = rna22739; Dbxref = GeneID:107513619,Genbank:XP_016006018.1; Name = XP_016006018.1; gbkey = CDS; gene = A3GALT2; product = alpha_1%2C3-galactosyltransferase_2 protein_id = XP_016006018.1
我想只提取最后一栏($ 9)中的基因名称(; gene = XXX;)。 输出:
NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2
完成此操作后,我想将第4,5,7,8列和第9列中提取的值组合在一个唯一列中 预期产出:
A3GALT2 1220137 1220159 - 0
我尝试使用awk
仅在最后一列中采用模式gene = xxxx。我的基因名称是带或不带数字的大写字母;并由';'分隔第九栏中的分号。
awk FS "[ \t]" '$9 ~/gene=[A-Z0-9]$/ {print $0, $4, $5, $7, $8}' <file>
它不起作用。是否有其他方法可以使用awk
或sed
或grep
更好?
提前感谢您的帮助。
答案 0 :(得分:2)
以下awk应该会帮助你。
awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1' Input_file
输出如下。
NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2
编辑: 正如我在评论中提到的那样,我很困惑你需要哪个输出,以防你需要你的第二个显示输出可能会帮助你。
awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} ' Input_file
输出如下。
A3GALT2 1220137 1220159 - 0
答案 1 :(得分:1)
awk 解决方案:
random.seed(444) # WHERE 444 IS ANY INTEGER
awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file
- 使用split($9,a,";")
作为分隔符将第9个字段拆分为数组a
;
- 从子字符串substr(a[6],6)
中提取所需的基因名称
输出:
gene=XXXXXXXX
答案 2 :(得分:1)
一个简单的 awk 解决方案
$ awk '{match($9,/gene=(\w+);/,a); print a[1],$4,$5,$7,$8}' file
A3GALT2 1220137 1220159 - 0
{match($9,/gene=(\w+);/,a);
:这将匹配gene=(\w+);
中的正则表达式$9
以及将存储在数组(\w+)
中的捕获组a
它
答案 3 :(得分:0)
感谢您的回复和帮助。是的,我想要你输出的输出。仅保留基因名称,位置,链和相位信息。它们将被用作新的fasta seqs的标题。我会尝试这些命令。