O script awk
a seguir supõe que a 9ª coluna pode ter dados em qualquer ordem.
O código dividirá a coluna em ;
seguido por um espaço opcional. Em seguida, iterará os elementos resultantes e os dividirá em espaços em um par de valores-chave. Se a chave (a coisa à esquerda do espaço) for qualquer uma das duas cadeias gene_id
ou gene_name
, o valor dessa chave será lembrado. A análise da 9ª coluna termina quando encontramos nossas duas strings, após as quais a coluna é reescrita e a linha modificada é impressa.
O código também descarta qualquer entrada que não contenha gene_id
e gene_name
.
BEGIN {
FS = OFS = "\t"
}
{
n = split($9, a, "; ?")
found = 0;
for (i = 1; i <= n; ++i)
if (split(a[i], b, " ") == 2) {
if (b[1] == "gene_id") {
gene_id = b[2]
++found
} else if (b[1] == "gene_name") {
gene_name = b[2]
++found
}
if (found == 2) break
}
if (found == 2) {
$9 = gene_id " " gene_name
print
}
}
Teste nos dados fornecidos:
$ awk -f script.awk <file
chr1 HAVANA exon 12613 12721 . + . "ENSG00000223972.5" "DDX11L1"
chr1 HAVANA exon 13221 14409 . + . "ENSG00000223972.5" "DDX11L1"
Para remover as aspas duplas dos valores, altere
if (found == 2) {
$9 = gene_id " " gene_name
print
}
em
if (found == 2) {
gsub("\"", "", gene_id)
gsub("\"", "", gene_name)
$9 = gene_id " " gene_name
print
}
que remove todas as aspas duplas do nome do gene e ID, ou
if (found == 2) {
gene_id = substr(gene_id, 2, length(gene_id) - 2)
gene_name = substr(gene_name, 2, length(gene_name) - 2)
$9 = gene_id " " gene_name
print
}
que remove o primeiro e o último caractere dos dois valores.