2014-02-19 2 views
0

Для каждой строки входного файла я хотел бы напечатать поле с строкой 'locus_tag =', и если нет соответствующего поля, напечатайте тире.Простая таблица анализа

входного файла (с разделителями табуляции):

GeneID_2=7277058 location=890211..892127 locus_tag=HAPS_0907 orientation=+ 
GeneID_2=7278144 gene=rlmL location=complement(1992599..1994776) locus_tag=HAPS_2029 
GeneID_2=7278145 gene=rlmT location=complement(1992599..1994776) timetoparse 

Желаемый результат:

locus_tag=HAPS_0907 
locus_tag=HAPS_2029 
- 

Пытались это, но не работает:

awk -F'\t' '{ for(i=1; i<=NF; i++) if($i ~/locus_tag=/) {print $i}; {for(i=1; i<=NF; i++) if($i !=/locus_tag=/) {print "-"}} }' SNP_annotations_ON_PROTEIN 

ответ

1

Вы были довольно близки:

$ awk -F'\t' '{ for(i=1; i<=NF; i++) if($i ~/locus_tag=/) {print $i; next} {print "-"}}' a 
GeneID_2=7277058 location=890211..892127 locus_tag=HAPS_0907 orientation=+ 
GeneID_2=7278144 gene=rlmL location=complement(1992599..1994776) locus_tag=HAPS_2029 
- 

Что вы имели:

{ for(i=1; i<=NF; i++) if($i ~/locus_tag=/) {print $i}; {for(i=1; i<=NF; i++) if($i !=/locus_tag=/) {print "-"}} }' 

То, что я писал:

{ for(i=1; i<=NF; i++) if($i ~/locus_tag=/) {print $i; next} {print "-"}} 
                 ^^^^ ^^^^^^^^^^^ 
         if found, print and go to next line  | 
    if you arrive here, it is because you did not find the pattern, so print dash 
1

С awk:

awk '/locus_tag/{for(x=1;x<=NF;x++) if($x~/^locus_tag=/) print $x;next}{print "-"}' file 
1

Вы можете играть с FS, чтобы сделать его проще:

awk -F'locus_tag=' 'NF>1{sub(/\s.*/,"",$2);print FS $2;next}$0="-"' f 
locus_tag=HAPS_0907 
locus_tag=HAPS_2029 
- 
1

С perl:

perl -ne 'print /(locus_tag=.*?)\s/?"$1\n":"-\n"' file 
locus_tag=HAPS_0907 
locus_tag=HAPS_2029 
- 
+0

Да, извините ... Я просто оптимизируя скриптлет ... Теперь это выглядит как опрятная (или, по крайней мере, кратчайший :-) из предложенных ответов ... :-) – MarcoS

2
perl -nE 'say m/(locus_tag=\S*)/ ? $1 : q/-/' 
+1

'perl -M5.010 -ne' может быть сокращен до 'perl -nE'. Опция '-E' включает все необязательные функции (например, say), хотя она не допускает строгих ограничений. – user49740

+0

@ user49740, спасибо за подсказку. Я еще не использовал '-E'. – Axeman

6
perl -lpe '($_)= (/(locus_tag=\S+)/, "-")' file 

выход

locus_tag=HAPS_0907 
locus_tag=HAPS_2029 
- 
+1

+1 Красивые !!!!! –

+0

Это действительно красиво. Но я предпочитаю читаемость по красоте ... :-) – MarcoS

1
$ awk '{print (match($0,/locus_tag=[^[:space:]]*/) ? substr($0,RSTART,RLENGTH) : "-")}' file 
locus_tag=HAPS_0907 
locus_tag=HAPS_2029 
- 
Смежные вопросы