Ordenando un archivo delimitado por tabuladores

Tengo una información con el siguiente formato:

foo1.001.332.003 

Ahora traté de ordenar el archivo según el último campo de forma decreciente. Intenté los siguientes comandos pero no se ordenó como esperábamos.

 $ sort -k3nr file.txt # apparently this sort by space as delimiter $ sort -t"\t" -k3nr file.txt sort: multi-character tab `\\t' $ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt sort: multi-character tab `\\t' 

¿Cuál es la forma correcta de hacerlo?

Aquí está la muestra de datos .

Usando bash , esto hará el truco:

 $ sort -t$'\t' -k3 -nr file.txt 

Observe el signo de dólar en frente de la cadena de una sola cita. Puede leer sobre esto en las secciones de Citas ANSI-C de la página del manual bash .

Por defecto, el delimitador de campo no está en blanco para la transición en blanco, por lo que la pestaña debería funcionar bien.

Sin embargo, las columnas están indexadas base 1 y base 0 por lo que probablemente desee

 sort -k4nr file.txt 

para ordenar archivo.txt por columna 4 numéricamente en orden inverso. (Aunque los datos en la pregunta tienen incluso 5 campos, el último campo sería el índice 5).

Debe colocar un carácter de tabulación real después de -t \ y para hacerlo en un intérprete de comandos, pulse ctrl-v y luego el carácter de tabulación. La mayoría de los proyectiles que he usado admiten este modo de entrada de tabulación literal.

Tenga cuidado, sin embargo, porque copiar y pegar desde otro lugar generalmente no conserva las tabs.

La $ solución no funcionó para mí. Sin embargo, al poner realmente el carácter de tabulación en el comando lo hizo: ordenar -t ” -k2

páselo por algo como awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }' . Esto cambiará los espacios en tabs.

En general, mantener datos como este no es una gran cosa si se puede evitar, porque las personas siempre confunden tabs y espacios.

La solución de su problema es muy sencilla en un lenguaje de scripting como Perl, Python o Ruby. Aquí hay un código de ejemplo:

 #!/usr/bin/perl -w use strict; my $sort_field = 2; my $split_regex = qr{\s+}; my @data; push @data, "7 8\t 9"; push @data, "4 5\t 6"; push @data, "1 2\t 3"; my @sorted_data = map { $_->[1] } sort { $a->[0] < => $b->[0] } map { [ ( split $split_regex, $_ )[$sort_field], $_ ] } @data; print "unsorted\n"; print join "\n", @data, "\n"; print "sorted by $sort_field, lines split by $split_regex\n"; print join "\n", @sorted_data, "\n"; 

Quería una solución para Gnu sort en Windows, pero ninguna de las soluciones anteriores funcionó para mí en la línea de comandos.

Utilizando la pista de Lloyd, el siguiente archivo por lotes (.bat) funcionó para mí.

Escriba el carácter de tabulación dentro de las comillas dobles.

 C:\>cat foo.bat sort -k3 -t" " tabfile.txt 

Estaba teniendo este problema con ordenar en cygwin en un shell bash al usar ‘general-numérico-sort’. Si especifiqué -t$'\t' -kFg , donde F es el número del campo, no funcionó, pero cuando especifiqué tanto -t$'\t' como -kF,Fg (por ejemplo, -k7,7g para el 7mo campo) funcionó. -kF,Fg sin -t$'\t' no funcionó.

Si desea hacerlo más fácil solo con tabs, reemplace los espacios con tabs:

 cat  | tr " " "\t" | sort