J'ai des données 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 moins en moins ..__ J'ai essayé les commandes suivantes, mais le tri n'a pas été effectué 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 le faire?
Voici les exemple de données .
En utilisant bash, ceci fera l'affaire:
$ sort -t$'\t' -k3 -nr file.txt
Remarquez le signe dollar devant la chaîne entre guillemets simples. Vous pouvez lire des informations surit dans les sections Cotes ANSI-C de la page de manuel bash .
Par défaut, le délimiteur de champ est une transition non vide à vide;.
Cependant, les colonnes sont indexées base 1 et base 0 donc vous voulez probablement
sort -k4nr file.txt
trier numériquement fichier.txt par colonne 4 dans l’ordre inverse. (Bien que les données de la question aient même 5 champs, le dernier champ serait l'index 5.)
Vous devez mettre un caractère de tabulation après le -t\et pour le faire dans un shell, 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 de saisie littérale.
Attention, cependant, copier et coller depuis un autre endroit ne conserve généralement pas les onglets.
La solution $ ne fonctionnait pas pour moi . Cependant, en plaçant le caractère de tabulation lui-même dans la commande, il:
dirigez-le vers quelque chose comme awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Cela changera les espaces en onglets.
En général, conserver des données comme celle-ci n’est pas une bonne chose à faire si vous pouvez les éviter, car les personnes créent toujours de la confusion entre les onglets et les espaces.
La résolution de votre problème est très simple dans un langage de script tel que Perl, Python ou Ruby. Voici un exemple de code:
#!/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";
Je voulais une solution pour le tri Gnu sous Windows, mais aucune des solutions ci-dessus ne fonctionnait pour moi en 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.
C:\>cat foo.bat
sort -k3 -t" " tabfile.txt
J'avais ce problème avec le tri dans cygwin dans un shell bash lorsque j'utilisais le "tri général-numérique". Si j'ai spécifié -t$'\t' -kFg
, où F est le numéro du champ, cela ne fonctionnait pas, mais lorsque j'ai spécifié à la fois -t$'\t'
et -kF,Fg
(par exemple -k7,7g
pour le 7ème champ), cela fonctionnait. -kF,Fg
sans le -t$'\t'
n'a pas fonctionné.
Si vous voulez vous faciliter la tâche en n'ayant que des onglets, remplacez les espaces par des onglets:
tr " " "\t" < <file> | sort <options>