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 } }}'
ループを削除するだけです。