РЕДАКТИРОВАТЬ: После просмотра образцов 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 значение, так как в случае обнаружения другим персонажем, оно перезапишет свое предыдущее значение.