Выберите отдельные строки в разных столбцах и распечатайте его AWK - PullRequest
0 голосов
/ 04 марта 2019

У меня есть синтаксис:

awk -F'\t' '{for(i=1;i<=NF;i++) {if($i~/ensembl_gene_id*/) {h=$i}} ;for(a=1;a<=NF;a++) {if($a~/ensembl_gn*/) {z=$a}} print $1,$2,$3,z,h}'

Это синтаксис для поиска большего количества строк в нескольких неопределенных полях, разделенных "\ t", и их печати.Но мои навыки не так хороши, и я хотел бы переписать его только одним циклом (теперь у меня есть два цикла для «i» и «a»).Не могли бы вы помочь мне разобраться с awk?(Код работает).

Я думаю что-то вроде этого:

awk -F'\t' '{for(i=1;i<=NF;i++) {if($i~/ensembl_gene_id* | esnembl_gn*/) {h=$i}}  {print $1,$2,$3,h}' 

Но он печатает только первое совпадение.

ВХОД:

1 2 les ensembl_gene_id=aaa aha ensembl_gn=BRAF 
2 3 pes ccds ensembl_gene_id=kkk ahl klkl ensembl_gn=OTC 
2 2 ves ccds=1 ccds=2 ensembl_gene_id=cac ensembl_gn=BRCA

ВЫХОД:

1 2 les ensembl_gene_id=aaa ensembl_gn=BRAF
2 3 pes ensembl_gene_id=kkk ensembl_gn=OTC
2 2 ves ensembl_gene_id=cac

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Просто пытаетесь напечатать поля ensembl_gene_id и ensembl_gn?Это было бы:

$ awk '{
    delete f
    for (i=1;i<=NF;i++) {
        split($i,t,/=/)
        f[t[1]] = $i
    }
    print $1, $2, $3, f["ensembl_gene_id"], f["ensembl_gn"]
}' file
1 2 les ensembl_gene_id=aaa ensembl_gn=BRAF
2 3 pes ensembl_gene_id=kkk ensembl_gn=OTC
2 2 ves ensembl_gene_id=cac ensembl_gn=BRCA
0 голосов
/ 04 марта 2019

РЕДАКТИРОВАТЬ: После просмотра образцов OP добавьте следующее решение (измените awk на awk 'BEGIN{FS=OFS="\t"}, если ваш Input_file с разделителями TAB и ваш вывод должен быть также с разделителями TAB.

awk '
match($0,/ensembl_gene_id[^ ]*/){
  val=substr($0,RSTART,RLENGTH)
}
match($0,/ensembl_gn[^ ]*/){
  val1=substr($0,RSTART,RLENGTH)
}
{
  print $1,$2,$3,val,val1
  val=val1=""
}
'  Input_file


Насколько я понял из вашего вопроса (вы хотите запустить один цикл for и проверить 2 условия. Если да, то нам не нужно использовать 2 цикла скореемы можем использовать один цикл с двумя условиями), пожалуйста, попробуйте следующее.

awk -F'\t' '{h=z="";for(i=1;i<=NF;i++){if($i~/ensembl_gene_id*/){h=$i};if($i~/ensembl_gn*/){z=$i}};print $1,$2,$3,z,h}'  Input_file

ИЛИ (форма решения не с одним вкладышем):

awk '
{
  h=z=""
  for(i=1;i<=NF;i++){
    if($i~/ensembl_gene_id*/){
      h=$i
    }
    if($i~/ensembl_gn*/){
      z=$i
    }
  }
  print $1,$2,$3,z,h
}
'  Input_file

Проблема сПопытка OP: всегда будет печататься только 1 значение, так как в случае обнаружения другим персонажем, оно перезапишет свое предыдущее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...