Tengo los datos en un archivo grande (280 columnas de ancho, 7 millones de líneas de largo!) y tengo que cambiar las dos primeras columnas. Creo que yo podría hacer esto con algún tipo de awk para el bucle, a print $2, $1, luego de un intervalo al final del archivo, pero no sé cómo hacerlo de la gama parte, y yo no se puede imprimir $2, $1, $3…$280! La mayoría de los de la columna de intercambio respuestas que he visto aquí son específicas para archivos pequeños con un número manejable de las columnas, por lo que necesito algo que no depende de la especificación de cada número de la columna.

El archivo delimitado por tabulaciones:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989

7 Comentarios

  1. 83

    Usted puede hacer esto mediante el intercambio de los valores de los dos primeros campos:

    awk ' { t = $1; $1 = $2; $2 = t; print; } ' input_file
    • Que es tan limpio y elegante, gracias! Tenía la esperanza de que habría una línea hacia fuera allí.
    • Esta respuesta es problemático con los diferentes tamaños de las columnas y sus separadores. Más extensible respuesta aquí unix.stackexchange.com/a/31596/16920
    • en realidad no es problemático con diferente número de columnas, sólo con una mezcla de separadores: por ejemplo, si usted tiene las fichas y espacios en su archivo, y usted sólo quiere separar la investigación por pestañas, usted necesita el BEGIN{FS='\t'} truco.
    • o el mucho más elegante -F'\t' opción para el awk comando!
    • El uso de -F '\t' pestañas son consumidas en el resultado final. Es allí una manera de conservarlos?
    • OK, uno tiene que especificar OFS=$'\t' como se ha señalado por el respuesta a continuación. @perreal, tal vez vale la pena la actualización de la respuesta con el parámetro adicional?
    • si usted utiliza: awk '{ print $2, $1}' es el mismo 😀
    • Esto fue realmente útil! Gracias por compartir!

  2. 19

    He probado la respuesta de perreal con cygwin en un sistema windows con un archivo separado. No funcionó, debido a que la norma separador es el espacio.

    Si te encuentras con el mismo problema, intente esto en su lugar:

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

    Entrante separador es definido por -F $'\t' y el separador para la salida por OFS=$'\t'.

    awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file > output_file
    • Super! Me faltaba la OFS=$'\t' parámetro!
    • Este enfoque puede terminar con fichas al inicio de la línea. Podría no ser el resultado previsto.
  3. 4

    Has probado a utilizar el comando cortar? E. g.

    cat myhugefile | cut -c10-20,c1-9,c21- > myrearrangedhugefile
    • No lo he hecho, pero voy a recordar que para un uso futuro!
    • -c=personajes … así que esto no columnas de intercambio.
    • Va a intercambiar las columnas en el archivo de salida – probar por ti mismo
    • ¿cómo podemos hacerlo sin saber el número de caracteres ? cat myhugefile | cut -f2,1 da el mismo resultado como cat myhugefile | cut -f1,2
    • Usted puede dar salida a cada columna a un archivo intermedio. Algo como: cut-f2 myhugefile > piece1 ; cut-f1 myhugefile > piece2 | pegar piece1 piece2 > myrearrangedhugefile ; rm piece1 ; rm piece2
  4. 4

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

    sed -i 's/^\([^\t]*\t\)\([^\t]*\t\)//' file
  5. 4

    Probar esta más relevantes a su pregunta :

    awk '{printf("%s\t%s\n", $2, $1)}' inputfile
    • Esto sólo se imprime la primera de las dos columnas. Ligeramente más compacto es awk '{print $2 "\t" $1}' inputfile.
  6. 2

    Podría hacerlo en Perl:

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

    La -F especifica el delimitador. En la mayoría de los proyectiles que usted necesita para preceder una barra diagonal inversa con otro para escapar de él. En algunas plataformas -F implica automáticamente -n y -a así que se puede quitar.

    Para el problema que usted no necesita usar -l debido a que la última de las columnas aparece el último en la salida. Pero si en una situación diferente, si la última columna debe aparecer entre las otras columnas, el carácter de nueva línea debe ser eliminado. El -l interruptor se encarga de esto.

    La "\t" en combinación puede ser cambiado a cualquier otra cosa para producir un delimitador en la salida.

    2..$#F especifica un rango de 2 hasta que la última columna. Como usted puede haber adivinado, dentro de los corchetes, se puede poner una sola columna o rango de las columnas en el orden que desee.

Dejar respuesta

Please enter your comment!
Please enter your name here