Estoy usando unix sort para ordenar un archivo delimitado por comas con múltiples columnas. Hasta ahora, esto ha funcionado perfectamente para ordenar los datos numéricamente o en orden alfabético:
Archivo de ejemplo antes de cualquier clasificación:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Ordenar el archivo: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Resultado ordenado:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Aquí está el problema: quiero ordenar la columna 2 según un orden personalizado, lo que significa que quiero primero a Estados Unidos, luego a Canadá y luego a Bahamas:
Tipo deseado:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
¿Hay alguna forma de pasar unix sort a un orden de clasificación personalizado que luego pueda aplicar? Algo como:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
¡Gracias!
join
comando, pero podría terminar con una gran cantidad de clasificación: los archivos de entradajoin
deben clasificarse en un orden, y luego volvería a usarlossort
para colocar los datos en un orden diferente (y perder la columna de orden de clasificación como un paso posterior a la clasificación).t
lugar def
en la última línea?Respuestas:
La otra respuesta y comentario responden la pregunta en general, así es como puede verse una implementación:
fuente
sed
no era realmente necesario aquí.No puedes hacer eso con una especie . En este punto, realmente deberías buscar awk / perl / your-language-of-choice . Sin embargo, puedes evitarlo. Podría, por ejemplo, usar sed para cambiar "Estados Unidos" a 0, "Canadá" a 1 y "Bahamas" a 2, luego hacer una ordenación numérica contra esa columna y luego volver a colocarla. O cambie "Estados Unidos" a "Estados Unidos, 0", etc., ordene la columna adicional y luego deséchela.
fuente
Acabo de escribir un ayudante llamado csort para que sea más fácil hacer esto. Prefija cada línea con un valor de su elección basado en subcadenas o coincidencias de expresiones regulares dentro de la línea:
La
2=STR
notación significa "coincidir si el segundo campo es igualSTR
".Luego, opcionalmente, puede canalizar la salida
cut -c3-
para eliminar el prefijo.fuente