Tengo archivos potencialmente grandes que necesitan ser ordenados por claves 1-n. Algunas de estas teclas pueden ser numéricas y algunas de ellas pueden no serlo. Este es un archivo columnar de ancho fijo, por lo que no hay delimitadores.
¿Hay una buena manera de hacer esto con Unix sort? Con una tecla es tan simple como usar '-n'. Leí la página del manual y busqué en Google brevemente, pero no encontré un buen ejemplo. ¿Cómo haría para lograr esto?
Nota: He descartado Perl debido al potencial de tamaño del archivo. Sería un último recurso.
Respuestas:
Use la
-k
opción (o--key=POS1[,POS2]
). Puede aparecer varias veces y cada tecla puede tener opciones globales (como lan
ordenación numérica)fuente
Tenga cuidado sin embargo:
Si desea ordenar el archivo principalmente por el campo 3, y en segundo lugar por el campo 2, desea esto:
No esto: lo
sort -k 3 -k 2 < inputfile
que clasifica el archivo por la cadena desde el comienzo del campo 3 hasta el final de la línea (que es potencialmente único).fuente
sort -k 3,3nr -k 2,2
-k2
debería ser-k2,2
y una coma final-k2,
debería ser 'mágico final de línea predeterminado o lo que sea'.La opción -k es lo que quieres.
Usaría las posiciones de caracteres 4-5 en el primer campo (todo es un campo para ancho fijo) y se ordenaría numéricamente como la primera clave.
La segunda clave serían los caracteres 14-15 en el primer campo también.
(editar)
Ejemplo (todo lo que tengo es DOS / cygwin a mano):
para los datos:
Ordena el listado del directorio por número de mes (pos. 4-5) numéricamente y luego por nombre de archivo (pos. 40-60) a la inversa. Como no hay pestañas, todo es el campo 1 para ordenar.
fuente
Aquí hay uno para ordenar varias columnas en un archivo csv por orden numérico y de diccionario, columnas 5 y posteriores como orden de diccionario
Tenga en cuenta que -k1,1n significa numérico que comienza en la columna 1 y termina en la columna 1. Si lo hubiera hecho a continuación, habría concatenado las columnas 1 y 2 haciendo 1,10 ordenado como 110
fuente
Creo en tu caso algo como
Funcionará mejor. @ es el separador de campo, asegúrese de que sea un carácter que no aparece en ninguna parte. entonces su entrada se considera que consta de una columna.
Editar: aparentemente clintp ya dio una respuesta similar, lo siento. Como él señala, las banderas 'n' y 'r' se pueden agregar a cada opción -k ....
fuente
Tenga en cuenta que también puede desearse estabilizar la ordenación con el
-s
interruptor, de modo que las líneas de igual rango mantengan también su orden relativo original en la salida.fuente
Solo quiero agregar algunos consejos, cuando use sort, tenga cuidado con su configuración regional que afecta el orden de la comparación de teclas. Usualmente uso explícitamente LC_ALL = C para hacer la configuración regional lo que quiero.
fuente