开发者社区> 问答> 正文

awk在while循环内仅在第一行打印,除非回显,理论解释

我有一个awk命令,可在循环中输出来自行修改的结果:

clinvar_db=$1
output_file=$2

if [ -f "$output_file" ]; then
  rm "$output_file"
fi

zcat < "$clinvar_db" | grep -v '^#' | while read line; do

  chr=`echo $line | awk '{print $1}' | tr -d '[:space:]'`
  pos=`echo $line | awk '{print $2}' | tr -d '[:space:]'`


  clnrevstat=`echo $line | sed -e 's/.*CLNREVSTAT=\(.*\);CLNSIG.*/\1/' | cut -d';' -f1`

  ref_all=`echo $line | awk '{print $4}' | tr -d '[:space:]'`
  alt_all=`echo $line | awk '{print $5}' | tr -d '[:space:]'`
  effect=`echo $line | sed -e 's/.*MC=\(.*\);.*/\1/' | cut -d';' -f1 | cut -d'|' -f2`
  ref_length=`printf $ref_all | wc -c | tr -d '[:space:]'`
  alt_length=`printf $alt_all | wc -c | tr -d '[:space:]'`
  if [ "$ref_length" -ne "$alt_length " ] || [ "$effect" == 'frameshift_variant' ] || [ "$effect" == 'nonsense' ] || [ "$effect" == 'splice_acceptor_variant' ] || [ "$effect" == 'splice_donor_variant' ]; then
    var_effect='lof'
  elif [ "$effect" == 'missense_variant' ]; then
    var_effect='miss'
  elif [ "$effect" == 'synonymous_variant' ]; then
    var_effect='syn'
  elif [ "$effect" == 'intron_variant' ] || [ "$effect" == '3_prime_UTR_variant' ]; then
    var_effect='intron'
  else
    var_effect='NA'
  fi

  if [ "$clnrevstat" == 'criteria_provided,_conflicting_interpretations' ] || [ "$clnrevstat" == 'criteria_provided,_single_submitter' ]; then
    clnstar=1
  elif [ "$clnrevstat" == 'no_assertion_criteria_provided' ] || [ "$clnrevstat" == 'no_assertion_provided' ] || [ "$clnrevstat" == 'no_interpretation_for_the_single_variant' ]; then
    clnstar=0
  elif [ "$clnrevstat" == 'criteria_provided,_multiple_submitters,_no_conflicts' ]; then
    clnstar=2
  elif [ "$clnrevstat" == 'reviewed_by_expert_panel' ]; then
    clnstar=3
  elif [ "$clnrevstat" == 'practice_guideline' ]; then
    clnstar=2
  else
    clnstar=NA
  fi

  awk -v OFS='\t' -v chr="$chr" -v pos="$pos" -v ref="$ref_all" -v alt="$alt_all" -v var_effect="$var_effect" -v clnstar="$clnstar" '{print chr,pos,".",ref,alt,".",".",".",var_effect,clnstar}'

done

这样一遍又一遍地输出相同的(第一条)行:

1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
1   949422  .   G   A   .   .   .   miss    1
# ...

如果我添加一个echo前一个awk

# ... rest of my script ...
  echo  | awk -v OFS='\t' -v chr="$chr" -v pos="$pos" -v ref="$ref_all" -v alt="$alt_all" -v var_effect="$var_effect" -v clnstar="$clnstar" '{print chr,pos,".",ref,alt,".",".",".",var_effect,clnstar}'
# ... rest of my script ...

输出:

1   949422  .   G   A   .   .   .   miss    1
1   949502  .   C   T   .   .   .   miss    1
1   949523  .   C   T   .   .   .   lof 0
1   949559  .   C   T   .   .   .   miss    1
1   949597  .   C   T   .   .   .   syn 1
1   949608  .   G   A   .   .   .   miss    1
1   949635  .   G   A   .   .   .   miss    1
1   949656  .   G   A   .   .   .   miss    1
1   949696  .   C   CG  .   .   .   lof 0
# ...

它可以解决问题,但我想向您了解专家们的原因!它不应该每次迭代执行一次吗?我已经在这里和网上搜索过,但我自己也无法解决...

提前非常感谢您的帮助!

展开
收起
祖安文状元 2020-01-06 16:21:04 537 0
1 条回答
写回答
取消 提交回答
  • 当您在awk没有回声的情况下调用时,它是从与while read循环相同的管道中读取的。while循环读取第一行,而awk读取其余所有行。

    2020-01-06 16:21:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载