Tengo datos con el siguiente formato:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Ahora intenté ordenar el archivo en función del ú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án los datos de muestra .
linux
unix
sorting
tab-delimited
Neversaint
fuente
fuente
'"'"'
para usarlo dentro de un alias.awk '{print $0 | "sort -nr" > "outfile" }' datafile
, excepto con un delimitador de tabulación escapado enviado al comando de clasificación.Por defecto, el delimitador de campo no está en blanco a 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
para ordenar file.txt por la columna 4 numéricamente en orden inverso. (Aunque los datos en la pregunta tienen incluso 5 campos, entonces el último campo sería el índice 5).
fuente
Debe colocar un carácter de tabulación real después de -t \ y para hacerlo en un shell, presione ctrl-v y luego el carácter de tabulación. La mayoría de los shells que he usado admiten este modo de entrada de tabulación literal.
Sin embargo, tenga cuidado, porque copiar y pegar desde otro lugar generalmente no conserva las pestañas.
fuente
C-q <tab>
por ejemplo. Creo que también está^V
en nano.La solución $ no funcionó para mí. Sin embargo, al poner realmente el carácter de tabulación en el comando hizo: sort -t '' -k2
fuente
<C-v><Tab>
para insertar pestañas en caso de que la tecla de pestañas se use para completar automáticamente en su shell.$'\t'
funciona en ksh, zsh y bash. Bourne Shell no lo admite. Ver esta publicación: unix.stackexchange.com/a/371873/201820canalizarla a través de algo así
awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Esto cambiará los espacios a pestañas.fuente
En general, mantener datos como este no es una gran cosa si se puede evitar, porque la gente siempre confunde las pestañas y los espacios.
Resolver su problema es muy sencillo en un lenguaje de script como Perl, Python o Ruby. Aquí hay un código de ejemplo:
fuente
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.
Usando 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.
fuente
Estaba teniendo este problema con sort en cygwin en un shell bash cuando usaba 'general-numeric-sort'. Si especifiqué
-t$'\t' -kFg
, donde F es el número de campo, no funcionó, pero cuando especifiqué ambos-t$'\t'
y-kF,Fg
(por ejemplo,-k7,7g
para el séptimo campo) funcionó.-kF,Fg
sin el-t$'\t'
no funcionó.fuente
Si quiere hacerlo más fácil con solo pestañas, reemplace los espacios con pestañas:
fuente
usage: tr [-Ccsu] string1 string2
tr string1 string2 <some-file
. Todo puede leer un archivo siempre que pueda leer stdin.La respuesta de Lars Haugseth solo funcionó desde la línea de comandos para mí, donde da este error si se ejecuta desde un script de shell:
ordenar: pestaña de varios caracteres '$ \ t'
La solución si está codificada en un script de shell si alguien está mirando es
el carácter de tabulación está entre comillas.
fuente