usando o awk para fazer um novo arquivo, resulta em problemas usando uma coluna específica, não consigo descobrir o que está errado

3

Tentando usar este arquivo ...

    MT      200610-1        100     2757
    MT      200610-10       100     6753
    MT      200610-100      100     15173

Deseja criar um novo arquivo semelhante a este, usando as colunas 1,2 e 4 ...

    chrMT   2756    2757    200610-1
    chrMT   6752    6753    200610-10
    chrMT   15172   15173   200610-100

Se eu fizer apenas os três primeiros assim, funciona ...

awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' test_ace_geno1.map
    chrMT 2756 2757
    chrMT 6752 6753
    chrMT 15172 15173

Se eu tentar adicionar na segunda coluna no final, algo estranho acontece ...

awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' test_ace_geno1.map
     200610-16 2757
     200610-10 6753
     200610-100 15173

Se eu fizer o vim com set list, ele será uma tabulação regular, então não tenho certeza do que está acontecendo aqui com aquela coluna que está bagunçando tudo.

    MT^I200610-1^I100^I2757$
    MT^I200610-10^I100^I6753$
    MT^I200610-100^I100^I15173$
    
por Catherine 26.09.2016 / 16:57

2 respostas

3

com finais de linha de estilo dos :

$ cat -e ip.txt 
    MT      200610-1        100     2757^M$
    MT      200610-10       100     6753 ^M$
    MT      200610-100      100     15173^M$

$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' ip.txt 
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173

$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' ip.txt 
 200610-16 2757
chrMT 6752 6753 200610-10
 200610-100 15173

Com perl para lidar com a linha de estilo dos terminando e obtendo a saída obrigatória:

$ perl -lane 'print "chr$F[0]\t", $F[3]-1, "\t$F[3]\t$F[1]"' ip.txt 
chrMT   2756    2757    200610-1
chrMT   6752    6753    200610-10
chrMT   15172   15173   200610-100

Com awk , altere primeiro a linha que termina para unix style, com dos2unix , se disponível, ou com perl

$ perl -i -pe 's|\r\n|\n|' ip.txt 
$ cat -e ip.txt 
    MT      200610-1        100     2757$
    MT      200610-10       100     6753 $
    MT      200610-100      100     15173$

e depois

$ awk -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt 
chrMT   2756    2757    200610-1
chrMT   6752    6753    200610-10
chrMT   15172   15173   200610-100

ou, com GNU awk , defina o registro de entrada para lidar com a terminação de linha no estilo dos

gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
    
por 26.09.2016 / 17:36
3

Coloque tudo na declaração print no formato desejado e faça qualquer operação necessária, por exemplo, a subtração $NF - 1 também:

awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt

Você pode obviamente usar $4 em vez de $NF aqui, mas como o quarto campo é o último, ambos apontariam para o mesmo campo.

Exemplo:

% awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt 
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
    
por 26.09.2016 / 17:06

Tags