web-dev-qa-db-fra.com

Tri d'un fichier délimité par des tabulations

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 .

154
neversaint

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 .

277
Lars Haugseth

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.)

10
laalto

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.

4
Brian Carlsen

La solution $ ne fonctionnait pas pour moi . Cependant, en plaçant le caractère de tabulation lui-même dans la commande, il:

2
Lloyd

dirigez-le vers quelque chose comme awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'. Cela changera les espaces en onglets.

1
Michiel Buddingh

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";
1
James Thompson

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
1
Lawrence Noronha

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é.

0
Danny

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>
0
The Unfun Cat