Добавьте столбец в начало файла с помощью awk

#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. идеально ! Большое спасибо