为什么这个 awk 命令打印输出两次

为什么这个 awk 命令打印输出两次

我尝试在 awk 中编写一个行将两列文件转换为三列文件。

即字符名称 & 开始位置 --> 字符名称 & if (Start>2000) then start -2000; else 0 & 起始位置

所以我写了下面的命令。

for i in `ls *.startlist`; do 
name=`basename $i .startlist`; 
awk -vOFS="\t" '{for (i=1; i<= NF; i++) { if($2 < 2000) { print $1,0,$2} else {print $1,$2-2000,$2 } }}' $i >${name}_promoter.bed; 
done

但这会打印每行两次。你能提出错误吗?并且也建议您是否有更好更快的方法。

答案1

您正在为每行运行 NF 次转换。您的输入有两个字段,因此它会使输出的每一行加倍。

尝试完全删除 for 循环并检查结果是否符合预期。

答案2

如果输入文件有两列,则每条记录中有两个字段(NF 为 2),并且每次调用 print 时都会对 i=1 和 i=2 执行 for 循环。

'{for (i=1; i<= NF; i++) { if($2 < 2000) { print $1,0,$2} else {print $1,$2-2000,$2 } }}'

只需删除循环即可。

相关内容