Usar awk para crear un archivo nuevo genera problemas al usar 1 columna específica, no puedo entender qué está mal

Usar awk para crear un archivo nuevo genera problemas al usar 1 columna específica, no puedo entender qué está mal

Intentando utilizar este archivo...

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

Quiere crear un nuevo archivo con este aspecto, usando las columnas 1,2 y 4...

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

Si solo hago los primeros tres así, 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

Si intento agregar la segunda columna al final, sucede algo extraño...

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

Si hago vim con la lista de configuración, muestra que es una pestaña normal, así que no estoy seguro de qué está pasando aquí con esa columna que está arruinando todo.

    MT^I200610-1^I100^I2757$
    MT^I200610-10^I100^I6753$
    MT^I200610-100^I100^I15173$

Respuesta1

con dosfinales de línea de estilo:

$ 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

Con perlpara manejar tanto dosel final de la línea de estilo como la obtención del resultado requerido:

$ 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

Con awk, cambie el final de línea al unixestilo primero, con dos2unixsi está disponible o conperl

$ 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$

y luego

$ 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

o, con GNU awk, establezca el registro de entrada para manejar el final de línea estilo dos

gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt

Respuesta2

Coloque todo en la printdeclaración en el formato deseado y realice cualquier operación necesaria, por ejemplo, la resta $NF - 1también:

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

Obviamente puedes usar $4en lugar de $NFaquí, pero como el cuarto campo es el último, ambos apuntarían al mismo campo.

Ejemplo:

% 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

información relacionada