我尝试在 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 } }}'
只需删除循环即可。