query - Cómo ordenar los archivos numéricamente desde la línea de comandos de Linux
logstash tutorial (3)
Bien, ahora esto es más una perorata sobre Linux que una pregunta, pero tal vez alguien sepa cómo hacer lo que quiero. Sé que esto se puede lograr con el comando de sort
, pero quiero una solución mejor porque hacer que eso funcione es tan fácil como escribir un programa en C para hacer lo mismo.
Tengo archivos, por razones, digamos que tengo estos archivos: (mis archivos son los mismos, solo tengo muchos más)
- archivo-10.xml
- archivo-20.xml
- archivo-100.xml
- archivo-k10.xml
- archivo-k20.xml
- archivo-k100.xml
- archivo-M10.xml
- archivo-M20.xml
- archivo-M100.xml
Ahora resulta que este es el orden en el que quiero que se ordenen. Por cierto, este es el orden en Windows en el que están ordenados por defecto. Eso es bueno. Windows agrupa los caracteres numéricos consecutivos en un carácter efectivo que ordena alfabéticamente antes de las letras.
Si ls
en la línea de comando de linux, obtengo la siguiente basura. Note que el 20 es desplazado. Esto es más importante cuando tengo cientos de estos archivos que quiero ver en un informe, en orden.
- archivo-100.xml
- archivo-10.xml
- archivo-20.xml
- archivo-k100.xml
- archivo-k10.xml
- archivo-k20.xml
- archivo-M100.xml
- archivo-M10.xml
- archivo-M20.xml
Puedo usar ls -1 | sort -n -k 1.6
ls -1 | sort -n -k 1.6
para obtener los que no tienen ''k'' o ''M'' correctos ...
- archivo-k100.xml
- archivo-k10.xml
- archivo-k20.xml
- archivo-M100.xml
- archivo-M10.xml
- archivo-M20.xml
- archivo-10.xml
- archivo-20.xml
- archivo-100.xml
Puedo usar ls -1 | sort -n -k 1.7
ls -1 | sort -n -k 1.7
para obtener nada de eso correcto
- archivo-100.xml
- archivo-10.xml
- archivo-20.xml
- archivo-k10.xml
- archivo-M10.xml
- archivo-k20.xml
- archivo-M20.xml
- archivo-k100.xml
- archivo-M100.xml
Bien vale. Vamos a hacerlo bien. ls -1 | grep "file-[0-9]*/.xml" | sort -n -k1.6 && ls -1 file-k*.xml | sort -n -k1.7 && ls -1 file-M*.xml | sort -n -k1.7
- archivo-10.xml
- archivo-20.xml
- archivo-100.xml
- archivo-k10.xml
- archivo-k20.xml
- archivo-k100.xml
- archivo-M10.xml
- archivo-M20.xml
- archivo-M100.xml
¡Uf! Me alegro de que el "poder de la línea de comandos de Linux" me salvó allí. (Esto no es práctico para mi situación, porque en lugar de ls -1
tengo un comando que es una línea o dos más)
Ahora, el comportamiento de Windows es simple, elegante y hace lo que usted quiere que haga el 99% del tiempo. ¿Por qué no puedo tener eso en Linux? ¿Por qué, oh, por qué la sort
no tiene un "número de orden automágico de una manera que no me hace golpear la cabeza contra la pared"?
Aquí está el pseudocódigo para C ++:
bool compare_two_strings_to_avoid_head_injury(string a, string b)
{
string::iterator ai = a.begin();
string::iterator bi = b.begin();
for(; ai != a.end() && bi != b.end(); ai++, bi++)
{
if (*ai is numerical)
gobble up the number incrementing ai past numerical chars;
if (*bi is numerical)
gobble up the number incrementing bi past numerical chars;
actually compare *ai and *bi and/or the gobbled up number(s) here
to determine if we need to compare more chars or can return the
answer now;
}
return something here;
}
¿Fue eso tan difícil? ¿Alguien puede poner esto en orden y enviarme una copia? ¿Por favor?
Este sería mi primer pensamiento:
ls -1 | sed ''s//-/([kM]/)/?/([0-9]/{2/}/)/./-/10/2./'' | sort | sed ''s/0/([0-9]/{2/}/)//1/''
Básicamente, solo uso sed
para rellenar el número con ceros y luego lo uso nuevamente para eliminar el cero inicial.
No sé si podría ser más rápido en Perl.
Intenta ordenar --version-sort -f
- archivo-10.xml
- archivo-20.xml
- archivo-100.xml
- archivo-k10.xml
- archivo-k20.xml
- archivo-k100.xml
- archivo-M10.xml
- archivo-M20.xml
- archivo-M100.xml
La opción -f es ignorar el caso (de lo contrario, pondría las k y las m en el orden incorrecto en este ejemplo). Sin embargo, no creo que la clase no esté interpretando correctamente las letras k y M como miles y millones, si ese era su objetivo, es simplemente un orden alfabético.
ls -1v
te ls -1v
bastante. Simplemente ordena todas las letras mayúsculas antes de las minúsculas.