linux - 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
# ...
它解决了问题,但我想从你们专家那里知道为什么!它不应该每次迭代都做一次吗?我在这里和网上搜索过,但我自己无法弄清楚......
非常感谢您的帮助!
解决方案
当您在没有回声的情况下调用时,它是从与循环awk
相同的管道中读取的。while read
while 循环读取第一行,而 awk 读取其余所有行。
推荐阅读
- c# - c# StreamReader,用回车区分新行和新行
- android - 在 RoomDatabase 中获取 onCorruption 回调而不破坏现有实现
- python-3.x - 如何使用 Python 替换文件中除第一次出现的字符串之外的所有出现的字符串?
- python - 调用另一个脚本时 Python 系统崩溃
- c++ - 拥有 unique_ptr 对象的唯一所有权是什么意思?
- javascript - 点击后如何更新 iframe url 中的参数?
- angular - 角 | 如何为 div 定义模板变量
- javascript - 如何处理超过 20 位数字(大整数)?
- javascript - Making a proper fade-in and fade-out for a slideshow
- php - 安全错误消息密钥翻译可能性(荷兰语)