Question

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 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 le faire?

Voici le exemple de données .

Était-ce utile?

La solution

En utilisant bash , cela fera l'affaire:

$ sort -t

Notez le signe dollar devant la chaîne entre guillemets simples. Vous pouvez lire sur dans la Citation de sections ANSI-C du bash page de manuel .

\t' -k3 -nr file.txt

Notez le signe dollar devant la chaîne entre guillemets simples. Vous pouvez lire sur dans la Citation de sections ANSI-C du bash page de manuel .

Autres conseils

Par défaut, le délimiteur de champ est une transition non vide à vide. L'onglet devrait donc fonctionner correctement.

Cependant, les colonnes sont indexées en base 1 et en base 0, vous voulez donc probablement

sort -k4nr file.txt

pour 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 placer 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, car copier et coller depuis un autre endroit ne conserve généralement pas les onglets.

La solution $ n'a pas fonctionné pour moi. Cependant, en plaçant le caractère de tabulation lui-même dans la commande, trier -t '' -k2

transmettez-lui quelque chose comme awk '{print print $ 1 "\ t" $ 2 "\ \ t" $ 3 "\ \\" 4 $ \' \ 5 '$ 5}' . Cela modifiera 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 gens 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  { 

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 gens 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:

<*>->[1] } sort { $a->[0] <=> $b->[0] } map { [ ( split $split_regex,

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 gens 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:

<*> )[$sort_field],

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 gens 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:

<*> ] } @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.

Saisissez le caractère de tabulation dans 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 n'a pas fonctionné, mais lorsque j'ai spécifié les deux -t $ '\ t' et -kF, Fg (par exemple, -k7,7g pour le 7ème champ), cela a fonctionné. -kF, Fg sans le -t $ '\ t' ne fonctionnait pas.

Si vous souhaitez vous simplifier la tâche en n'utilisant que des onglets, remplacez les espaces par des onglets:

tr " " "\t" < <file> | sort <options>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top