J'ai une donnée au format suivant:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Maintenant, j'ai essayé de trier le fichier en fonction du dernier champ de manière décroissante. J'ai essayé les commandes suivantes mais elles n'ont pas été triées comme prévu.
$ 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'
Quelle est la bonne façon de procéder?
Voici les exemples de données .
linux
unix
sorting
tab-delimited
Neversaint
la source
la source
'"'"'
pour l'utiliser dans un alias.awk '{print $0 | "sort -nr" > "outfile" }' datafile
, sauf avec un séparateur de tabulation échappé envoyé à la commande sort.-g
plutôt que-n
si vous voulez un tri numérique.-n
est cassé.Par défaut, le délimiteur de champ est une transition non vide à vide, donc la tabulation devrait fonctionner correctement.
Cependant, les colonnes sont indexées en base 1 et en base 0, donc vous voulez probablement
pour trier le fichier.txt par colonne 4 numériquement dans l'ordre inverse. (Bien que les données de la question aient même 5 champs, le dernier champ serait l'index 5.)
la source
Vous devez mettre un caractère de tabulation réel après le -t \ et pour le faire dans un shell, vous appuyez sur ctrl-v puis sur le caractère de tabulation. La plupart des shells que j'ai utilisés prennent en charge ce mode d'entrée de tabulation littérale.
Méfiez-vous cependant, car le fait de copier-coller depuis un autre endroit ne préserve généralement pas les onglets.
la source
C-q <tab>
par exemple. Je pense que c'est aussi^V
en nano.La solution $ n'a pas fonctionné pour moi. Cependant, en mettant réellement le caractère de tabulation lui-même dans la commande a fait: sort -t '' -k2
la source
<C-v><Tab>
pour insérer une tabulation au cas où la touche de tabulation serait utilisée pour l'auto-complétion dans votre shell.$'\t'
fonctionnent dans ksh, zsh et bash. Bourne shell ne le prend pas en charge. Voir cet article: unix.stackexchange.com/a/371873/201820tuyau à travers quelque chose comme
awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Cela changera les espaces en tabulations.la source
En général, conserver de telles données n'est pas une bonne chose à faire si vous pouvez les éviter, car les gens confondent toujours les onglets et les espaces.
Résoudre votre problème est très simple dans un langage de script comme Perl, Python ou Ruby. Voici un exemple de code:
la source
Je voulais une solution pour le tri Gnu sur Windows, mais aucune des solutions ci-dessus ne fonctionnait pour moi sur la ligne de commande.
En utilisant l'indice de Lloyd, le fichier de commandes suivant (.bat) a fonctionné pour moi.
Tapez le caractère de tabulation entre les guillemets.
la source
J'avais ce problème avec le tri dans cygwin dans un shell bash lors de l'utilisation de 'general-numeric-sort'. Si j'ai spécifié
-t$'\t' -kFg
, où F est le numéro de champ, cela n'a pas fonctionné, mais quand j'ai spécifié les deux-t$'\t'
et-kF,Fg
(par exemple-k7,7g
pour le 7e champ), cela a fonctionné.-kF,Fg
sans le-t$'\t'
n'a pas fonctionné.la source
Si vous souhaitez vous faciliter la tâche en ne disposant que d'onglets, remplacez les espaces par des onglets:
la source
usage: tr [-Ccsu] string1 string2
tr string1 string2 <some-file
. Tout peut lire un fichier tant qu'il peut lire stdin.La réponse de Lars Haugseth n'a fonctionné qu'à partir de la ligne de commande pour moi où elle donne cette erreur si elle est exécutée à partir d'un script shell:
tri: onglet multi-caractères '$ \ t'
La solution si elle est codée dans un script shell si quelqu'un regarde est
le caractère de tabulation est entre les guillemets.
la source