Ordenar datos según la segunda columna de un archivo

213

Tengo un archivo de dos columnas y nnúmero de filas.

la columna 1 contiene namesy la columna2 age.

Quiero ordenar el contenido de este archivo en orden ascendente según age(en la segunda columna).

El resultado debería mostrar el namede la persona más joven junto con la namesegunda persona más joven y así sucesivamente ...

Cualquier sugerencia para un shell de línea única o script bash.

Angelo
fuente
1
Superconjunto: delimitador personalizado: stackoverflow.com/questions/1037365/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

330

Puedes usar el sortcomando :

sort -k2 -n yourfile

-n, --numeric-sortcompare según el valor numérico de la cadena

Por ejemplo:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54
Matt Ryall
fuente
1
También tenga en cuenta que el uso en -hlugar de -nordenará los valores legibles por humanos como 2Go 3Kasí como los números separados por comas, por ejemplo1,234.5
chillitom
Problema con el pedido "incorrecto". Preste atención al hombre "*** ADVERTENCIA *** La configuración regional especificada por el entorno afecta el orden de clasificación. Establezca LC_ALL=Cpara obtener el orden de clasificación tradicional que utiliza valores de bytes nativos". (para mayúsculas y minúsculas sin -n)
x'ES
Esto no considera espacios en la primera columna ni funciona si hay más columnas después de la segunda, ya que -k se lee hasta el final de la línea. Suponiendo que es un archivo TSV, una mejor solución essort -t$'\t' -k2 -n FILE
tuxErrante
es posible que deba especificar su delimitador utilizando la opción -t
espectro
85

Solución:

sort -k 2 -n filename

escrito más detalladamente como:

sort --key 2 --numeric-sort filename


Ejemplo:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Explicación:

  • -k # : este argumento especifica la primera columna que se utilizará para ordenar. (tenga en cuenta que la columna aquí se define como un campo delimitado por espacios en blanco; el argumento -k5se ordenará comenzando con el quinto campo en cada línea, no el quinto carácter en cada línea)

  • -n : esta opción especifica un "orden numérico", lo que significa que la columna debe interpretarse como una fila de números, en lugar de texto.


Más:

Otras opciones comunes incluyen:

  • -r : esta opción invierte el orden de clasificación. También se puede escribir como --reverse .
  • -i : esta opción ignora los caracteres no imprimibles. También se puede escribir como --ignore-nonprinting .
  • -b : esta opción ignora los espacios en blanco iniciales, lo que es útil ya que los espacios en blanco se utilizan para determinar el número de filas. También se puede escribir como --ignore-Leading-Blanks .
  • -f : esta opción ignora mayúsculas y minúsculas. "A" == "a". También se puede escribir como --ignore-case .
  • -t [nuevo separador] : esta opción hace que el preprocesamiento utilice un operador que no sea espacio. También se puede escribir como --field-separator .

Hay otras opciones, pero estas son las más comunes y útiles, que uso con frecuencia.

DCurro
fuente
@Angelo Esta respuesta probablemente se publicó años después de haber aceptado una respuesta a esta pregunta, pero ¿la ha considerado como la nueva respuesta aceptada?
Jonathan Y.
¡La opción -tera un salvavidas real! cuando sus columnas tienen espacios y las columnas difieren según un carácter dado ,o una pestaña
AKS
12

Para valores separados por tabuladores, se puede usar el siguiente código

sort -t$'\t' -k2 -n

-r puede usarse para obtener datos en orden descendente.
-n para ordenación numérica
-k, --key = POS1 [, POS2] donde k es la columna en el archivo
Para el orden descendente a continuación se encuentra el código

sort -t$'\t' -k2 -rn
Saurabh
fuente
4

Uso sort.

sort ... -k 2,2 ...
Ignacio Vazquez-Abrams
fuente
8
También debe usar -n para ordenar según las edades (ordenación numérica). De lo contrario, '11' vendrá antes que '2'.
Matt Ryall