Ordenar en base a la tercera columna

Me encuentro con un archivo enorme de 4 columnas. I'd como para mostrar el archivo ordenado en stdout basado en su tercera columna:

cat myFile | sort -u -k3

¿Es suficiente para realizar el truco?

Solución
sort -k 3,3 myFile

mostraría el archivo ordenado por la columna 3rd suponiendo que las columnas están separadas por secuencias de espacios en blanco (caracteres ASCII SPC y TAB en la configuración regional POSIX/C), según el orden de clasificación definido por la configuración regional actual.

Tenga en cuenta que los espacios en blanco a la izquierda están incluidos en la columna (el separador por defecto es la transición de un espacio en blanco a un espacio en blanco), lo que puede suponer una diferencia en las localizaciones en las que los espacios no se ignoran a efectos de comparación, utilice la opción -b para ignorar los espacios en blanco a la izquierda.

Tenga en cuenta que es completamente independiente del shell (todos los shells analizarían esa línea de comandos igual, los shells generalmente no tienen el comando sort incorporado).

La ordenación -k 3 es para ordenar la parte de las líneas que comienzan con la columna 3rd (incluyendo los espacios en blanco iniciales). En la configuración local C, debido a que los caracteres de espacio y tabulación se sitúan antes de todos los caracteres imprimibles, esto le dará generalmente el mismo resultado que -k 3,3 (excepto para las líneas que tienen un tercer campo idéntico),

-u es para retener sólo una de las líneas si hay varias que se ordenan de forma idéntica (es decir, cuando la clave de ordenación ordena lo mismo (eso'no es necesariamente lo mismo que ser igual)).

cat es el comando para concatenar. No lo necesita aquí.

Si las columnas están separadas por algo más, necesitas la opción t para especificar el separador.

Archivo de ejemplo dado a.

$ cat a
a c c c
a b ca d
a b  c e
a b c d

Con -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Las líneas 2 y 3 tienen la misma tercera columna, pero aquí la clave de ordenación es desde la tercera columna hasta el final de línea, por lo que -u conserva ambas. La línea 2 tiene la misma tercera columna, pero aquí la clave de ordenación es desde la tercera columna hasta el final de la línea, por lo que "u" conserva ambas.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

Arriba sólo se retiene uno para los que la 3ª columna es ␠c. Obsérvese cómo se retiene la que tiene ␠␠c (2 espacios iniciales).

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Observa cómo se invierte el orden de a b c d y a c c c. En el primer caso, debido a que ␠c␠c ordena antes que ␠c␠d, en el segundo caso debido a que la clave de ordenación es la misma (␠c), la comparación de último recurso que compara las líneas en su totalidad pone a b c d antes que a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Una vez que ignoramos los espacios en blanco, la clave de ordenación de las 3 primeras líneas es la misma (c), por lo que se ordenan por la comparación de último recurso.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

En la configuración local de C, ␠␠c ordena antes que ␠c, ya que allí sólo hay una pasada en la que los caracteres (luego los bytes individuales) se ordenan según su valor de punto de código (donde el espacio tiene un punto de código menor que c).

Comentarios (7)

Si entiendes "columna" como archivo de texto (cuarto carácter), entonces sí, tu solución debería funcionar (o incluso sort -u -k3 miArchivo para permitir que sort realice algunas magias de ahorro de memoria con acceso aleatorio). Si entiendes "columna" como base de datos - una entidad completa de datos seguida de un separador, y un ancho de columna variable, necesitarás algo más elegante, por ejemplo, esto ordena ls -l por tamaño

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(que es equivalente al trivial ls -lS pero sirve para el ejemplo).

Comentarios (2)
sort -g -k column_number 

es el comando correcto para ordenar cualquier lista que tenga caracteres numéricos utilizando una columna específica

Comentarios (2)