2010-11-25 19 views
12

Tengo una lista de nombres de tabla, que están desordenados. ¿Cómo puedo obtenerlos en el orden lógico correcto?¿Cómo puedo ordenar cadenas alfanuméricas en Unix?

$ cat list.txt

TAB1 
TAB13 
TAB11 
TAB19 
TAB2 
TAB3 
TAB16 
TAB17 
TAB18 
TAB9 
TAB10 
TAB8 
TAB12 
TAB20 

$ cat list.txt | sort -n

TAB1 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB2 
TAB20 
TAB3 
TAB8 
TAB9 

fin esperado:

TAB1 
TAB2 
TAB3 
TAB8 
TAB9 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB20 

Cualquier vim short-cuts también lo hará, no necesariamente necesito una utilidad separada para esto.

+0

Marcadores porque es una pregunta tan buena (con algunas respuestas correctas) –

Respuesta

19

Usted necesita que le indiquen dónde se inicia su clave de clasificación:

sort -n -k1.4 list.txt 

De lo contrario, se inicia desde el principio, no puede convertir una cadena en un número en verano y para la comparación alfabético.

+0

+1 por ser más rápido :), – Adrien

+6

Me llevó un poco averiguar cómo funciona -k: 1 es el número de campo y 4 es el carácter. Si hubiera un espacio (el separador de campo predeterminado) después de la T en TAB, entonces usaría 'sort -n -k2.4 list.txt'. Puede usar -t para especificar separadores de campo personalizados. 'sort -n -tB -k2.1 list.txt' también funcionaría porque la B en TAB dividiría los campos y ordenaríamos el primer carácter del segundo campo hasta el final de la línea. – idbrii

7

Dado que esto está etiquetado como una pregunta de Vim, pensé que podría valer la pena mencionar la opción de Vim (aunque yo personalmente usaría sort ya que los datos ya están en un archivo). Es simplemente

:sort n 

Desde ordenación numérica de Vim ignora hasta el primer número decimal, uno no necesita pasar por alto el "TAB" (:sort puede tener un patrón de ignorar, :sort n /TAB/ iba a funcionar, así, por ejemplo) . Como de costumbre, :h :sort para más información.

+0

Gracias. No sabía esto. Tuve que soportar mucho dolor al eliminar _string_, ordenarlo y volver a poner _string_. –

+0

@jeffjose: Eso solo funciona fácilmente si tienes la misma cadena en todos los casos; falla cuando no lo haces. Lo peor es cuando no se puede pasar el comando de shell 'sort -kX.Yn' a una posición fija. A menudo tuve que escribir un guión de Perl para manejar esas situaciones y desearía no haberlo hecho. De forma similar para ordenar por el último campo cuando hay un número variable de campos, aunque allí puede simplemente invertir el orden de los campos, oriéntelos y luego vuelva a invertirlos. – tchrist

2

Usted puede hacer esto en Perl o cualquier otro idioma en clase le permite especificar un operador de comparación:.

sub numcomp() {

$a =~ /([0-9]*)$/; $aa = $1; 
$b =~ /([0-9]*)$/; $bb = $1; 
$aa <=> $bb; 

}

sort numcomp @mylist...

(no molestan diciéndome que Perl del bebé que ... um, escribió de esa manera a propósito, así sería fácil de entender.) (No se moleste en decirme que está mal. Yo ... um, lo escribí de esa manera como ejercicio para el lector.)

18

Siempre puede realizar la ordenación con el argumento -V para ordenar la cadena alfanumérica ..

$ sort -V inputfile > outputfile 

$ cat inputfile 
TAB1 
TAB13 
TAB11 
TAB19 
TAB2 
TAB3 
TAB16 
TAB17 
TAB18 
TAB9 
TAB10 
TAB8 
TAB12 
TAB20 

$ cat outputfile 
TAB1 
TAB2 
TAB3 
TAB8 
TAB9 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB20 
Cuestiones relacionadas