2010-08-18 5 views
13

J'ai essayé d'obtenir les valeurs uniques dans chaque colonne d'un fichier délimité par tabulation dans bash. Donc, j'ai utilisé la commande suivante.Tri dans bash

cut -f <column_number> <filename> | sort | uniq -c 

Il fonctionne très bien et je peux obtenir les valeurs uniques dans une colonne et son compte comme

105 Linux 
55 MacOS 
500 Windows 

Ce que je veux faire est au lieu de trier les noms de valeur de la colonne (dans cet exemple, sont les noms des systèmes d'exploitation) Je veux les trier par nombre et éventuellement avoir le compte dans la deuxième colonne dans ce format de sortie. Donc, il devra ressembler à:

Windows 500 
MacOS 105 
Linux 55 

Comment faire?

Répondre

14

Utilisation:

cut -f <col_num> <filename> 
    | sort 
    | uniq -c 
    | sort -r -k1 -n 
    | awk '{print $2" "$1}' 

Les sort -r -k1 -n sortes dans l'ordre inverse, en utilisant le premier champ comme une valeur numérique. Le awk inverse simplement l'ordre des colonnes. Vous pouvez tester le pipeline ajouté des commandes ainsi (avec plus belle mise en forme):

pax> echo '105 Linux 
55 MacOS 
500 Windows' | sort -r -k1 -n | awk '{printf "%-10s %5d\n",$2,$1}' 
Windows  500 
Linux  105 
MacOS   55 
+3

je le fais habituellement 'sorte -k1,1' de sorte que le champ spécifié, sinon les lignes sont triées par tous les champs du champ 1 à la fin de la ligne. – Hasturkun

2

Mine:

cut -f <column_number> <filename> | sort | uniq -c | awk '{ print $2" "$1}' | sort 

Cela modifie l'ordre des colonnes (awk) et puis juste trier la sortie.

Espérons que cela vous aidera

+1

Cela trie par nom plutôt que de compter. –

+0

Bien sûr, à partir de la question de sfactor: "Ce que je veux faire, c'est de trier par les noms de valeurs de colonnes" – sourcerebels