uso texto reemplazar primera numero mostrar mayor con comandos columnas columna básico buscar sed awk

sed - texto - mostrar columnas awk



Intercambia dos columnas: awk, sed, python, perl (7)

¿Has intentado usar el comando de corte? P.ej

cat myhugefile | cut -c10-20,c1-9,c21- > myrearrangedhugefile

Tengo datos en un archivo grande (¡280 columnas de ancho, 7 millones de líneas de largo!) Y necesito cambiar las dos primeras columnas. Creo que podría hacer esto con una especie de awk for loop, imprimir $ 2, $ 1, luego un rango hasta el final del archivo, pero no sé cómo hacer la parte del rango, y no puedo imprimir $ 2 , $ 1, $ 3 ... $ 280! La mayoría de las respuestas de intercambio de columnas que he visto aquí son específicas de archivos pequeños con un número manejable de columnas, por lo que necesito algo que no dependa de especificar cada número de columna.

El archivo está delimitado por tabulaciones:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989


Esto podría funcionar para usted (GNU sed):

sed -i ''s/^/([^/t]*/t/)/([^/t]*/t/)//2/1/'' file


Esto también es fácil en Perl:

perl -pe ''s/^(/S+)/t(/S+)/$2/t$1/;'' file > outputfile


Podrías hacer esto en Perl:

perl -F//t -nlae ''print join("/t", @F[1,0,2..$#F])'' inputfile

El -F especifica el delimitador. En la mayoría de los proyectiles debes preceder una barra invertida con otra para escapar de ella. En algunas plataformas, -F implica automáticamente -n y -a para que puedan descartarse.

Para su problema, no necesitaría usar -l porque las últimas columnas aparecen últimas en la salida. Pero si en una situación diferente, si la última columna debe aparecer entre otras columnas, el carácter de nueva línea debe eliminarse. El -l se ocupa de esto.

La "/t" en la unión se puede cambiar a cualquier otra cosa para producir un delimitador diferente en la salida.

2..$#F especifica un rango de 2 hasta la última columna. Como habrás adivinado, dentro de los corchetes, puedes poner cualquier columna o rango de columnas en el orden deseado.


Probé la respuesta de perreal con cygwin en un sistema de Windows con un archivo separado por pestañas. No funcionó, porque el separador estándar es el espacio.

Si encuentra el mismo problema, intente esto en su lugar:

awk -F $''/t'' '' { t = $1; $1 = $2; $2 = t; print; } '' OFS=$''/t'' input_file

El separador entrante se define por -F $''/t'' y el separador por salida por OFS=$''/t'' .

awk -F $''/t'' '' { t = $1; $1 = $2; $2 = t; print; } '' OFS=$''/t'' input_file > output_file


Pruebe esto más relevante para su pregunta:

awk ''{printf("%s/t%s/n", $2, $1)}'' inputfile


Puedes hacer esto intercambiando valores de los primeros dos campos:

awk '' { t = $1; $1 = $2; $2 = t; print; } '' input_file