¿El archivo de clasificación de shell de Linux de acuerdo con la segunda columna?

88

Tengo un archivo como este:

FirstName, FamilyName, Address, PhoneNumber

¿Cómo puedo ordenarlos por FamilyName?

Rami Jarrar
fuente
¿Qué sistema operativo y procesador de comandos?
Preet Sangha
1
Posible duplicado de Ordenar Unix con delimitador de tabulación
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

153

Si es UNIX:

sort -k 2 file.txt

Puede utilizar varias -kmarcas para ordenar en más de una columna. Por ejemplo, para ordenar por apellido y luego el nombre como desempate:

sort -k 2,2 -k 1,1 file.txt

Opciones relevantes de "ordenar por hombre":

-k, --key = POS1 [, POS2]

iniciar una tecla en POS1, finalizarla en POS2 (origen 1)

POS es F [.C] [OPTS], donde F es el número de campo y C la posición del carácter en el campo. OPTS es una o más opciones de pedido de una sola letra, que anulan las opciones de pedido global para esa clave. Si no se da ninguna clave, utilice toda la línea como clave.

-t, --campo-separador = SEP

use SEP en lugar de transición de no blanco a blanco

John Kugelman
fuente
2
Solo tenga un poco de cuidado al usarlo --field-separator=','si puede tener un operador de entrada de datos que ingrese valores para "Nombre" como "Billy Bob" o lo que sea ... los espacios pueden ingresar fácilmente a sus datos si no se protege contra ellos, pero las comas son relativamente poco probables.
Tony Delroy
1
Es muy probable que haya casos de comas en esos campos, como "Smith, Jr." o "McDowell, Sr." o "Dr. John" o "Nueva York, NY"
jbnunn
2
Tenga en cuenta que si las columnas están alineadas visualmente, es decir, hay un número no constante de espacios entre cada campo, debe utilizar la -bopción. Esto se debe a sortque, en realidad, se está considerando que la cadena a ordenar comienza justo después de la coma y no desde la primera letra de la columna. Además, es posible que deba anteponer el comando con LC_ALL=C, para evitar cualquier efecto secundario debido a la configuración regional, que puede suceder incluso en un archivo ASCII simple.
calandoa
@calandoa Gracias por la parte en -b( --ignore-leading-blanks). Para aclarar un poco: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2da a<SPACE><SPACE>bprimero (la segunda columna comienza después de la primera non-blank to blank transition, y <SPACE><SPACE>bes antes <SPACE>a), pero con -bda aa<SPACE>acomo se esperaba ( aes antes b).
Kirill Bulygin
7

Para ordenar solo por segundo campo (por lo tanto, donde los segundos campos coinciden, las líneas con coincidencias permanecen en el orden en que están en el original sin clasificar en otros campos):

sort -k 2,2 -s orig_file > sorted_file
Cian
fuente
3

FWIW, aquí hay un método de clasificación para mostrar qué procesos están usando más memoria virt.

memstat | sort -k 1 -t':' -g -r | less

Las opciones de clasificación se establecen en la primera columna, utilizando: como separador de columnas, clasificación numérica y clasificación a la inversa.

netskink
fuente
2
sort -nk2 file.txt

En consecuencia, puede cambiar el número de columna.

Dheeraj Kumar
fuente