Почему эта команда awk выводит результат дважды

Я пробовал написать однострочник в awk для преобразования файла с двумя столбцами в файл с тремя столбцами.

т.е. имя chr и начальная позиция -> chr name & if (Start> 2000) then start -2000; else 0 & start position

Итак, я написал следующую команду.

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

, но при этом каждая строка печатается дважды. Можете ли вы подсказать ошибку? а также предложите, есть ли у вас лучший и более быстрый способ сделать то же самое.

0
09.03.2017, 12:40
2 ответа

вы выполняете преобразование NF раз для каждой строки. Ваш ввод имеет два поля, поэтому он удваивает каждую строку вашего вывода.

Попробуйте полностью удалить цикл for и проверьте, соответствует ли результат желаемому.

1
28.01.2020, 02:46

Если входной файл имеет два столбца, в каждой записи есть два поля (NF равно 2), и цикл for выполняется для i = 1 и i = 2 и каждый раз вызывается печать.

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

Просто удалите петлю.

0
28.01.2020, 02:46

Теги

Похожие вопросы