mp3tag - mp3 tag linux
Clasificando múltiples claves con clasificación Unix (7)
Tengo archivos potencialmente grandes que deben ordenarse por claves 1-n. Algunas de estas claves pueden ser numéricas y algunas de ellas podrían no serlo. Este es un archivo columnar de ancho fijo por lo que no hay delimitadores.
¿Hay una buena manera de hacer esto con el tipo de Unix? Con una tecla es tan simple como usar ''-n''. He leído la página de manual y he buscado brevemente en Google, pero no he encontrado un buen ejemplo. ¿Cómo podría lograr esto?
Nota: he descartado Perl debido al potencial del tamaño del archivo. Sería un último recurso.
Aquí hay uno para ordenar varias columnas en un archivo csv por orden numérico y de diccionario, columnas 5 y después como orden de diccionario
~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga
Tenga en cuenta que -k1,1n significa numérico comenzando en la columna 1 y terminando en la columna 1. Si lo hubiera hecho a continuación, habría concatenado la columna 1 y 2 haciendo 1,10 ordenado como 110
~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga
Creo en tu caso algo así como
sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile
funcionará mejor @ es el separador de campo, asegúrese de que sea un personaje que no aparece en ninguna parte. entonces su entrada se considera como que consiste en 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 ....
La opción -k es lo que quieres.
-k 1.4,1.5n -k 1.14,1.15n
Usaría las posiciones de los caracteres 4-5 en el primer campo (es todo un campo para el ancho fijo) y ordenaría numéricamente como la primera clave.
La segunda clave serían los personajes 14-15 en el primer campo también.
(editar)
Ejemplo (todo lo que tengo es DOS / cygwin útil):
dir | /cygwin/bin/sort.exe -k 1.4,1.5n -k 1.40,1.60r
para los datos:
12/10/2008 01:10 PM 1,564,990 outfile.txt
Ordena numéricamente el listado de directorios por número de mes (pos 4-5), y luego por nombre de archivo (pos 40-60) en reversa. Como no hay pestañas, todo el campo 1 se ordena.
Solo quiero agregar algunos consejos, cuando usa ordenar, tenga cuidado con su configuración regional que afecta el orden de la comparación de claves. Usualmente uso explícitamente LC_ALL = C para hacer que lo local sea lo que quiero.
Ten cuidado, sin embargo:
Si desea ordenar el archivo principalmente por el campo 3, y secundariamente por el campo 2, no quiere esto:
sort -k 3 -k 2 < inputfile
quieres esto en su lugar:
sort -k 3,3 -k 2,2 < inputfile
El primero ordena el archivo por la cadena desde el principio del campo 3 hasta el final de la línea (que es potencialmente único).
-k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2
(default end of line)
Tenga en cuenta que también se puede desear estabilizar el género con el interruptor -s
, de modo que las líneas con el mismo orden mantienen también su orden relativo original en la salida.
Use la opción -k
(o --key=POS1[,POS2]
). Puede aparecer varias veces y cada tecla puede tener opciones globales (como n
para el orden numérico)