tutorial query puertos indice documentacion crear linux command-line sorting

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.