#unix #awk
Вопрос:
У меня есть очень простой однострочник, который работает почти идеально. Я хочу добавить новый столбец в файл с надписью «некодирование или кодирование» в зависимости от условий в столбцах 12 и 3 (если в столбце 12 есть подстрока РНК или mir — и/или столбец 3 == «псевдоген», тогда в столбце 1 должно быть указано некодирование или кодирование).
#file
X FlyBase pseudogene 19910168 19910521 . - . gene_id "FBgn0052821"; gene_symbol "CR32821"; transcript_id "FBtr0307588"; transcript_symbol "CR32821-RB";
X FlyBase pseudogene 476857 479309 . - . gene_id "FBgn0029523"; gene_symbol "CR18275"; transcript_id "FBtr0070097"; transcript_symbol "CR18275-RA";
X FlyBase pseudogene 5832298 5832368 . . gene_id "FBgn0052761"; gene_symbol "tRNA:Glu-CTC-6-1Psi"; transcript_id "FBtr0070818"; transcript_symbol "tRNA:Glu-CTC-6-1Psi-RA";
X FlyBase pseudogene 6361496 6362960 . - . gene_id "FBgn0016974"; gene_symbol "swaPsi"; transcript_id "FBtr0070923"; transcript_symbol "swaPsi-RA";
X FlyBase pseudogene 6361496 6363310 . - . gene_id "FBgn0016974"; gene_symbol "swaPsi"; transcript_id "FBtr0334014"; transcript_symbol "swaPsi-RB";
X FlyBase gene 20025099 20025170 . . gene_id "FBgn0052826"; gene_symbol "tRNA:Pro-CGG-1-1";
X FlyBase gene 1482492 1482590 . - . gene_id "FBgn0044508"; gene_symbol "snoRNA:M";
X FlyBase gene 2330159 2330826 . . gene_id "FBgn0053218"; gene_symbol "lncRNA:CR33218";
X FlyBase gene 3427452 3427523 . - . gene_id "FBgn0052493"; gene_symbol "tRNA:Gln-TTG-2-1";
X FlyBase gene 3819699 3819770 . . gene_id "FBgn0052785"; gene_symbol "tRNA:Gln-CTG-2-1";
X FlyBase gene 3827622 3827693 . . gene_id "FBgn0025118"; gene_symbol "tRNA:Pro-CGG-3-1";
2L FlyBase gene 825969 833241 . . gene_id "FBgn0010583"; gene_symbol "dock";
2L FlyBase gene 852768 854539 . . gene_id "FBgn0020545"; gene_symbol "kraken";
2L FlyBase gene 855337 856639 . . gene_id "FBgn0031288"; gene_symbol "CG13949";
2L FlyBase gene 860197 861806 . . gene_id "FBgn0031289"; gene_symbol "CG13950";
2L FlyBase gene 877302 878270 . . gene_id "FBgn0002936"; gene_symbol "ninaA";
#command
awk '{ if($12 ~ /RNA/ || $12 ~ /mir-/ || $3 == "pseudogene") $1="non-coding"; else $1="coding"; print }' a.gene-pseudogene_all_dmel-all-r6.40.gtf
Код работает, но он заменяет столбец 1. Чего я не хочу, я хочу добавить этот новый столбец перед столбцом 1 (чтобы он стал новым столбцом 1).
Как я могу его настроить?
Ответ №1:
Вы можете (эффективно) дополнить новый столбец, преобразовав $1
его в something OFS $1
. Вы на самом деле не создаете новый столбец ( $2
по-прежнему относится к исходному второму столбцу и $1
относится к «обоим» новым столбцам), но в данном случае это не важно:
awk '{
x = ( $12~/RNA|mir-/ || $3=="pseudogene" ) ? "non-" : ""
$1 = x "coding" OFS $1
print
}' a.gene-pseudogene_all_dmel-all-r6.40.gtf
Описанный выше метод можно использовать для вставки до (или после) любого столбца. Поскольку мы добавляем перед первым столбцом (или если бы мы добавляли после последнего), код можно сделать более эффективным, избегая назначения:
awk '{
x = ( $12~/RNA|mir-/ || $3=="pseudogene" ) ? "non-" : ""
print x "coding", $0
}' a.gene-pseudogene_all_dmel-all-r6.40.gtf
Комментарии:
1. идеально ! Большое спасибо