Por que este comando awk imprime a saída duas vezes

0

Eu tentei escrever um forro no awk para converter um arquivo de duas colunas em três colunas.

i.e. chr name & posição inicial   - > chr name & if (Start > 2000), em seguida, inicie -2000; mais 0 & posição inicial

Então eu escrevi o comando abaixo.

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

mas isso imprime todas as linhas duas vezes. Você pode sugerir o erro. e também sugerir se você tem uma maneira melhor e mais rápida para o mesmo.

    
por Onkar Nath 09.03.2017 / 11:34

2 respostas

1

você está executando sua transformação NF vezes para cada linha. Sua entrada tem dois campos, então duplica cada linha de sua saída.

Tente remover completamente o loop for e verifique se o resultado é o desejado.

    
por 09.03.2017 / 11:57
0

Se o arquivo de entrada tiver duas colunas, haverá dois campos em cada registro (NF é 2) e o loop for será executado para i = 1 ei = 2 e cada vez que uma impressão for chamada.

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

Basta remover o loop.

    
por 09.03.2017 / 12:00