このawkコマンドが出力を2回印刷するのはなぜですか?

このawkコマンドが出力を2回印刷するのはなぜですか?

2つの列ファイルを3つの列ファイルに変換するために、awkに1行を作成しようとしています。

つまり、キャラクター名&開始位置 - >キャラクター名&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

しかし、これは各行を2回印刷します。バグを提起できますか?そして、より良いより速い方法があれば提案してください。

答え1

行ごとにNF変換を実行しています。入力には2つのフィールドがあるため、出力の各行は2倍になります。

forループを完全に削除し、結果が期待したものと同じであることを確認してください。

答え2

入力ファイルに2つの列がある場合、各レコードには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 } }}'

ループを削除するだけです。

関連情報